[CRIU] [PATCH 1/4] show: Merge fsize and show-fn getting switches

Pavel Emelyanov xemul at parallels.com
Fri Jul 11 09:20:15 PDT 2014


Signed-off-by: Pavel Emelyanov <xemul at parallels.com>
---
 protobuf.c | 122 ++++++++++++++++++++++++++++---------------------------------
 1 file changed, 56 insertions(+), 66 deletions(-)

diff --git a/protobuf.c b/protobuf.c
index 21f9b9d..da45668 100644
--- a/protobuf.c
+++ b/protobuf.c
@@ -49,6 +49,16 @@ struct pb_pr_ctrl_s {
 typedef struct pb_pr_ctrl_s pb_pr_ctl_t;
 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)
 {
 	pr_msg("%#x", *(int *)field->data);
@@ -158,47 +168,6 @@ static int show_bytes(pb_pr_field_t *field)
 	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)
 {
 	switch (field->fmt[0]) {
@@ -305,50 +274,72 @@ static int pb_field_show_pretty(const ProtobufCFieldDescriptor *fd, pb_pr_ctl_t
 	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_SINT32:
 	case PROTOBUF_C_TYPE_UINT32:
 	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_SINT64:
 	case PROTOBUF_C_TYPE_SFIXED64:
 	case PROTOBUF_C_TYPE_FIXED32:
 	case PROTOBUF_C_TYPE_UINT64:
 	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);
+		break;
+
 	case PROTOBUF_C_TYPE_STRING:
-		return pb_msg_string;
+		sh->fsize = sizeof (void *);
+		sh->show = pb_msg_string;
+		break;
 	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:
-		return show_enum;
+		sh->fsize = 4;
+		sh->show = show_enum;
+		ctl->arg = (void *)fd->descriptor;
+		break;
+
 	case PROTOBUF_C_TYPE_BOOL:
-		return show_bool;
+		sh->fsize = sizeof (protobuf_c_boolean);
+		sh->show = show_bool;
+		break;
 	case PROTOBUF_C_TYPE_BYTES:
-		return show_bytes;
+		sh->fsize = sizeof (ProtobufCBinaryData);
+		sh->show = show_bytes;
+		break;
 	case PROTOBUF_C_TYPE_FLOAT:
+		sh->fsize = 4;
+		break;
 	case PROTOBUF_C_TYPE_DOUBLE:
+		sh->fsize = 8;
 		break;
+
 	default:
 		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))
-		return pb_show_pretty;
-	return get_pb_show_function(fd->type, fd->label);
+		sh->show = pb_show_pretty;
 }
 
-static void pb_show_repeated(const ProtobufCFieldDescriptor *fd, pb_pr_ctl_t *ctl, int nr_fields, pb_pr_show_t show,
-			  size_t fsize)
+static void pb_show_repeated(const ProtobufCFieldDescriptor *fd, pb_pr_ctl_t *ctl,
+		int nr_fields, struct pb_shower *sh)
 {
 	pb_pr_field_t *field = &ctl->cur;
 	unsigned long counter;
@@ -364,8 +355,8 @@ static void pb_show_repeated(const ProtobufCFieldDescriptor *fd, pb_pr_ctl_t *ct
 		field->count = nr_fields;
 		for (counter = 0; counter < nr_fields; counter++) {
 			field->data = (void *)(*(long *)p);
-			show(field);
-			p += fsize;
+			sh->show(field);
+			p += sh->fsize;
 		}
 
 		return;
@@ -375,22 +366,21 @@ static void pb_show_repeated(const ProtobufCFieldDescriptor *fd, pb_pr_ctl_t *ct
 	for (counter = 0; counter < nr_fields; counter++) {
 		if (counter)
 			pr_msg(":");
-		show(field);
-		field->data += fsize;
+		sh->show(field);
+		field->data += sh->fsize;
 	}
 }
 
 static void pb_show_field(const ProtobufCFieldDescriptor *fd,
 			  int nr_fields, pb_pr_ctl_t *ctl)
 {
-	pb_pr_show_t show;
+	struct pb_shower sh;
 
 	print_tabs(ctl);
 	pr_msg("%s: ", fd->name);
 
-	show = get_show_function(fd, ctl);
-
-	pb_show_repeated(fd, ctl, nr_fields, show, pb_show_prepare_field_context(fd, ctl));
+	pb_prepare_shower(fd, ctl, &sh);
+	pb_show_repeated(fd, ctl, nr_fields, &sh);
 
 	if (ctl->single_entry)
 		pr_msg("\n");
-- 
1.8.4.2




More information about the CRIU mailing list