[OpenWrt-Devel] [PATCH libubox 08/20] blob: refactor attr parsing into separate function

Petr Štetiar ynezz at true.cz
Thu Dec 19 16:58:24 EST 2019


Making blob_parse easier to review.

Signed-off-by: Petr Štetiar <ynezz at true.cz>
---
 blob.c | 61 +++++++++++++++++++++++++++++++++-------------------------
 1 file changed, 35 insertions(+), 26 deletions(-)

diff --git a/blob.c b/blob.c
index 9b3d8abe330a..ee93894b9e6f 100644
--- a/blob.c
+++ b/blob.c
@@ -217,44 +217,53 @@ blob_check_type(const void *ptr, unsigned int len, int type)
 	return true;
 }
 
-int
-blob_parse(struct blob_attr *attr, struct blob_attr **data, const struct blob_attr_info *info, int max)
+static int
+blob_parse_attr(struct blob_attr *attr, struct blob_attr **data, const struct blob_attr_info *info, int max)
 {
-	struct blob_attr *pos;
 	int found = 0;
-	size_t rem;
+	int id = blob_id(attr);
+	size_t len = blob_len(attr);
 
-	memset(data, 0, sizeof(struct blob_attr *) * max);
-	blob_for_each_attr(pos, attr, rem) {
-		int id = blob_id(pos);
-		size_t len = blob_len(pos);
+	if (id >= max)
+		return 0;
 
-		if (id >= max)
-			continue;
+	if (info) {
+		int type = info[id].type;
 
-		if (info) {
-			int type = info[id].type;
+		if (type < BLOB_ATTR_LAST) {
+			if (!blob_check_type(blob_data(attr), len, type))
+				return 0;
+		}
 
-			if (type < BLOB_ATTR_LAST) {
-				if (!blob_check_type(blob_data(pos), len, type))
-					continue;
-			}
+		if (info[id].minlen && len < info[id].minlen)
+			return 0;
 
-			if (info[id].minlen && len < info[id].minlen)
-				continue;
+		if (info[id].maxlen && len > info[id].maxlen)
+			return 0;
 
-			if (info[id].maxlen && len > info[id].maxlen)
-				continue;
+		if (info[id].validate && !info[id].validate(&info[id], attr))
+			return 0;
+	}
 
-			if (info[id].validate && !info[id].validate(&info[id], pos))
-				continue;
-		}
+	if (!data[id])
+		found++;
 
-		if (!data[id])
-			found++;
+	data[id] = attr;
+	return found;
+}
 
-		data[id] = pos;
+int
+blob_parse(struct blob_attr *attr, struct blob_attr **data, const struct blob_attr_info *info, int max)
+{
+	struct blob_attr *pos;
+	int found = 0;
+	size_t rem;
+
+	memset(data, 0, sizeof(struct blob_attr *) * max);
+	blob_for_each_attr(pos, attr, rem) {
+		found += blob_parse_attr(pos, data, info, max);
 	}
+
 	return found;
 }
 

_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel


More information about the openwrt-devel mailing list