diff options
author | Petr Štetiar <ynezz@true.cz> | 2019-12-09 15:53:27 +0300 |
---|---|---|
committer | Petr Štetiar <ynezz@true.cz> | 2019-12-25 12:31:58 +0300 |
commit | 6d27336e4a8b6e7ab7628509101beb16fcc08bba (patch) | |
tree | fe682ee7b2de7e3ff7cc48bea8eaa5c3fdda5270 /blob.c | |
parent | 833d25797b16b3720d86843a43e1438c4b029de9 (diff) |
blob: refactor attr parsing into separate function
Making blob_parse easier to review.
Signed-off-by: Petr Štetiar <ynezz@true.cz>
Diffstat (limited to 'blob.c')
-rw-r--r-- | blob.c | 61 |
1 files changed, 35 insertions, 26 deletions
@@ -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; } |