Commit 1cd57697 authored by Pavel Emelyanov's avatar Pavel Emelyanov

show: Merge fsize and show-fn getting switches

Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
Acked-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
parent 24a2cec4
...@@ -49,6 +49,16 @@ struct pb_pr_ctrl_s { ...@@ -49,6 +49,16 @@ struct pb_pr_ctrl_s {
typedef struct pb_pr_ctrl_s pb_pr_ctl_t; typedef struct pb_pr_ctrl_s pb_pr_ctl_t;
typedef int (*pb_pr_show_t)(pb_pr_field_t *field); typedef int (*pb_pr_show_t)(pb_pr_field_t *field);
/*
* This one describes how fields should be shown
* @fsize is the size of the field entry
* @show is the callback to print the entry
*/
struct pb_shower {
size_t fsize;
pb_pr_show_t show;
};
static int pb_msg_int32x(pb_pr_field_t *field) static int pb_msg_int32x(pb_pr_field_t *field)
{ {
pr_msg("%#x", *(int *)field->data); pr_msg("%#x", *(int *)field->data);
...@@ -158,47 +168,6 @@ static int show_bytes(pb_pr_field_t *field) ...@@ -158,47 +168,6 @@ static int show_bytes(pb_pr_field_t *field)
return 0; return 0;
} }
static size_t pb_show_prepare_field_context(const ProtobufCFieldDescriptor *fd,
pb_pr_ctl_t *ctl)
{
size_t fsize = 0;
switch (fd->type) {
case PROTOBUF_C_TYPE_ENUM:
ctl->arg = (void *)fd->descriptor;
case PROTOBUF_C_TYPE_INT32:
case PROTOBUF_C_TYPE_SINT32:
case PROTOBUF_C_TYPE_UINT32:
case PROTOBUF_C_TYPE_SFIXED32:
case PROTOBUF_C_TYPE_FLOAT:
fsize = 4;
break;
case PROTOBUF_C_TYPE_INT64:
case PROTOBUF_C_TYPE_SINT64:
case PROTOBUF_C_TYPE_SFIXED64:
case PROTOBUF_C_TYPE_FIXED32:
case PROTOBUF_C_TYPE_UINT64:
case PROTOBUF_C_TYPE_FIXED64:
case PROTOBUF_C_TYPE_DOUBLE:
fsize = 8;
break;
case PROTOBUF_C_TYPE_MESSAGE:
ctl->arg = (void *)fd->descriptor;
case PROTOBUF_C_TYPE_STRING:
fsize = sizeof (void *);
break;
case PROTOBUF_C_TYPE_BOOL:
fsize = sizeof (protobuf_c_boolean);
break;
case PROTOBUF_C_TYPE_BYTES:
fsize = sizeof (ProtobufCBinaryData);
break;
default:
BUG();
}
return fsize;
}
static int pb_show_pretty(pb_pr_field_t *field) static int pb_show_pretty(pb_pr_field_t *field)
{ {
switch (field->fmt[0]) { switch (field->fmt[0]) {
...@@ -305,50 +274,72 @@ static int pb_field_show_pretty(const ProtobufCFieldDescriptor *fd, pb_pr_ctl_t ...@@ -305,50 +274,72 @@ static int pb_field_show_pretty(const ProtobufCFieldDescriptor *fd, pb_pr_ctl_t
return 0; return 0;
} }
static pb_pr_show_t get_pb_show_function(int type, int label) static void pb_prepare_shower(const ProtobufCFieldDescriptor *fd,
pb_pr_ctl_t *ctl, struct pb_shower *sh)
{ {
switch (type) { sh->fsize = 0;
sh->show = pb_msg_unk;
switch (fd->type) {
case PROTOBUF_C_TYPE_INT32: case PROTOBUF_C_TYPE_INT32:
case PROTOBUF_C_TYPE_SINT32: case PROTOBUF_C_TYPE_SINT32:
case PROTOBUF_C_TYPE_UINT32: case PROTOBUF_C_TYPE_UINT32:
case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_SFIXED32:
return pb_msg_int32x; sh->fsize = 4;
sh->show = pb_msg_int32x;
break;
case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_INT64:
case PROTOBUF_C_TYPE_SINT64: case PROTOBUF_C_TYPE_SINT64:
case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_SFIXED64:
case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_FIXED32:
case PROTOBUF_C_TYPE_UINT64: case PROTOBUF_C_TYPE_UINT64:
case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_FIXED64:
return (label == PROTOBUF_C_LABEL_REPEATED ? sh->fsize = 8;
sh->show = (fd->label == PROTOBUF_C_LABEL_REPEATED ?
pb_msg_int64x_r : pb_msg_int64x); pb_msg_int64x_r : pb_msg_int64x);
break;
case PROTOBUF_C_TYPE_STRING: case PROTOBUF_C_TYPE_STRING:
return pb_msg_string; sh->fsize = sizeof (void *);
sh->show = pb_msg_string;
break;
case PROTOBUF_C_TYPE_MESSAGE: case PROTOBUF_C_TYPE_MESSAGE:
return show_nested_message; sh->fsize = sizeof (void *);
sh->show = show_nested_message;
ctl->arg = (void *)fd->descriptor;
break;
case PROTOBUF_C_TYPE_ENUM: case PROTOBUF_C_TYPE_ENUM:
return show_enum; sh->fsize = 4;
sh->show = show_enum;
ctl->arg = (void *)fd->descriptor;
break;
case PROTOBUF_C_TYPE_BOOL: case PROTOBUF_C_TYPE_BOOL:
return show_bool; sh->fsize = sizeof (protobuf_c_boolean);
sh->show = show_bool;
break;
case PROTOBUF_C_TYPE_BYTES: case PROTOBUF_C_TYPE_BYTES:
return show_bytes; sh->fsize = sizeof (ProtobufCBinaryData);
sh->show = show_bytes;
break;
case PROTOBUF_C_TYPE_FLOAT: case PROTOBUF_C_TYPE_FLOAT:
sh->fsize = 4;
break;
case PROTOBUF_C_TYPE_DOUBLE: case PROTOBUF_C_TYPE_DOUBLE:
sh->fsize = 8;
break; break;
default: default:
BUG(); BUG();
} }
return pb_msg_unk;
}
static pb_pr_show_t get_show_function(const ProtobufCFieldDescriptor *fd, pb_pr_ctl_t *ctl)
{
if (pb_field_show_pretty(fd, ctl)) if (pb_field_show_pretty(fd, ctl))
return pb_show_pretty; sh->show = pb_show_pretty;
return get_pb_show_function(fd->type, fd->label);
} }
static void pb_show_repeated(const ProtobufCFieldDescriptor *fd, pb_pr_ctl_t *ctl, int nr_fields, pb_pr_show_t show, static void pb_show_repeated(const ProtobufCFieldDescriptor *fd, pb_pr_ctl_t *ctl,
size_t fsize) int nr_fields, struct pb_shower *sh)
{ {
pb_pr_field_t *field = &ctl->cur; pb_pr_field_t *field = &ctl->cur;
unsigned long counter; unsigned long counter;
...@@ -364,8 +355,8 @@ static void pb_show_repeated(const ProtobufCFieldDescriptor *fd, pb_pr_ctl_t *ct ...@@ -364,8 +355,8 @@ static void pb_show_repeated(const ProtobufCFieldDescriptor *fd, pb_pr_ctl_t *ct
field->count = nr_fields; field->count = nr_fields;
for (counter = 0; counter < nr_fields; counter++) { for (counter = 0; counter < nr_fields; counter++) {
field->data = (void *)(*(long *)p); field->data = (void *)(*(long *)p);
show(field); sh->show(field);
p += fsize; p += sh->fsize;
} }
return; return;
...@@ -375,22 +366,21 @@ static void pb_show_repeated(const ProtobufCFieldDescriptor *fd, pb_pr_ctl_t *ct ...@@ -375,22 +366,21 @@ static void pb_show_repeated(const ProtobufCFieldDescriptor *fd, pb_pr_ctl_t *ct
for (counter = 0; counter < nr_fields; counter++) { for (counter = 0; counter < nr_fields; counter++) {
if (counter) if (counter)
pr_msg(":"); pr_msg(":");
show(field); sh->show(field);
field->data += fsize; field->data += sh->fsize;
} }
} }
static void pb_show_field(const ProtobufCFieldDescriptor *fd, static void pb_show_field(const ProtobufCFieldDescriptor *fd,
int nr_fields, pb_pr_ctl_t *ctl) int nr_fields, pb_pr_ctl_t *ctl)
{ {
pb_pr_show_t show; struct pb_shower sh;
print_tabs(ctl); print_tabs(ctl);
pr_msg("%s: ", fd->name); pr_msg("%s: ", fd->name);
show = get_show_function(fd, ctl); pb_prepare_shower(fd, ctl, &sh);
pb_show_repeated(fd, ctl, nr_fields, &sh);
pb_show_repeated(fd, ctl, nr_fields, show, pb_show_prepare_field_context(fd, ctl));
if (ctl->single_entry) if (ctl->single_entry)
pr_msg("\n"); pr_msg("\n");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment