From: Petr Štetiar Date: Mon, 9 Dec 2019 12:53:27 +0000 (+0100) Subject: blob: refactor attr parsing into separate function X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=6d27336e4a8b6e7ab7628509101beb16fcc08bba;p=project%2Flibubox.git blob: refactor attr parsing into separate function Making blob_parse easier to review. Signed-off-by: Petr Štetiar --- diff --git a/blob.c b/blob.c index 9b3d8ab..ee93894 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; }