Commit 705411f4 authored by Kinsbursky Stanislav's avatar Kinsbursky Stanislav Committed by Pavel Emelyanov

protobuf: vertical output support introduced

Will be used for single-entry images.
Signed-off-by: 's avatarStanislav Kinsbursky <skinsbursky@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 5809e7d0
...@@ -59,12 +59,17 @@ extern int pb_write_object_with_header(int fd, void *obj, ...@@ -59,12 +59,17 @@ extern int pb_write_object_with_header(int fd, void *obj,
#include <google/protobuf-c/protobuf-c.h> #include <google/protobuf-c/protobuf-c.h>
extern void do_pb_show_plain(int fd, const ProtobufCMessageDescriptor *d, extern void do_pb_show_plain(int fd, const ProtobufCMessageDescriptor *d,
pb_unpack_t unpack, pb_free_t free); pb_unpack_t unpack, pb_free_t free, int single_entry);
/* Don't have objects at hands to also do typechecking here */ /* Don't have objects at hands to also do typechecking here */
#define pb_show_plain(__fd, __proto_message_name) \ #define pb_show_plain(__fd, __proto_message_name) \
do_pb_show_plain(__fd, &__proto_message_name##__descriptor, \ do_pb_show_plain(__fd, &__proto_message_name##__descriptor, \
(pb_unpack_t)__proto_message_name##__unpack, \ (pb_unpack_t)__proto_message_name##__unpack, \
(pb_free_t)__proto_message_name##__free_unpacked) (pb_free_t)__proto_message_name##__free_unpacked, 0)
#define pb_show_vertical(__fd, __proto_message_name) \
do_pb_show_plain(__fd, &__proto_message_name##__descriptor, \
(pb_unpack_t)__proto_message_name##__unpack, \
(pb_free_t)__proto_message_name##__free_unpacked, 1)
#endif /* PROTOBUF_H__ */ #endif /* PROTOBUF_H__ */
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
struct pb_pr_ctrl_s { struct pb_pr_ctrl_s {
void *arg; void *arg;
int single_entry;
}; };
typedef struct pb_pr_ctrl_s pb_pr_ctl_t; typedef struct pb_pr_ctrl_s pb_pr_ctl_t;
...@@ -47,13 +48,18 @@ static void pb_msg_unk(void *obj, pb_pr_ctl_t *ctl) ...@@ -47,13 +48,18 @@ static void pb_msg_unk(void *obj, pb_pr_ctl_t *ctl)
pr_msg("unknown object %p\n", obj); pr_msg("unknown object %p\n", obj);
} }
static void print_nested_message_braces(pb_pr_ctl_t *ctl, int side)
{
pr_msg("%s%s", (side) ? "]" : "[", (ctl->single_entry) ? "\n" : " ");
}
static void pb_show_msg(const void *msg, pb_pr_ctl_t *ctl); static void pb_show_msg(const void *msg, pb_pr_ctl_t *ctl);
static void show_nested_message(void *msg, pb_pr_ctl_t *ctl) static void show_nested_message(void *msg, pb_pr_ctl_t *ctl)
{ {
pr_msg("[ "); print_nested_message_braces(ctl, 0);
pb_show_msg(msg, ctl); pb_show_msg(msg, ctl);
pr_msg(" ] "); print_nested_message_braces(ctl, 1);
} }
static void show_enum(void *msg, pb_pr_ctl_t *ctl) static void show_enum(void *msg, pb_pr_ctl_t *ctl)
...@@ -133,6 +139,9 @@ static void pb_show_field(const ProtobufCFieldDescriptor *fd, void *where, ...@@ -133,6 +139,9 @@ static void pb_show_field(const ProtobufCFieldDescriptor *fd, void *where,
show(where, ctl); show(where, ctl);
} }
if (ctl->single_entry)
pr_msg("\n");
else
pr_msg(" "); pr_msg(" ");
} }
...@@ -164,9 +173,9 @@ static void pb_show_msg(const void *msg, pb_pr_ctl_t *ctl) ...@@ -164,9 +173,9 @@ static void pb_show_msg(const void *msg, pb_pr_ctl_t *ctl)
} }
void do_pb_show_plain(int fd, const ProtobufCMessageDescriptor *md, void do_pb_show_plain(int fd, const ProtobufCMessageDescriptor *md,
pb_unpack_t unpack, pb_free_t free) pb_unpack_t unpack, pb_free_t free, int single_entry)
{ {
pb_pr_ctl_t ctl = {NULL}; pb_pr_ctl_t ctl = {NULL, single_entry};
while (1) { while (1) {
void *obj; void *obj;
...@@ -176,8 +185,10 @@ void do_pb_show_plain(int fd, const ProtobufCMessageDescriptor *md, ...@@ -176,8 +185,10 @@ void do_pb_show_plain(int fd, const ProtobufCMessageDescriptor *md,
ctl.arg = (void *)md; ctl.arg = (void *)md;
pb_show_msg(obj, &ctl); pb_show_msg(obj, &ctl);
pr_msg("\n");
free(obj, NULL); free(obj, NULL);
if (single_entry)
break;
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