diff options
author | Peter Rajnoha <prajnoha@redhat.com> | 2015-10-16 15:50:13 +0200 |
---|---|---|
committer | Peter Rajnoha <prajnoha@redhat.com> | 2015-10-16 17:05:54 +0200 |
commit | 508f0f5a21af8decf32944e01ecf17c0059a9c9f (patch) | |
tree | 1c9e58d9f01433fc10b1a7a9e13d3ca6effee448 /libdm/libdm-report.c | |
parent | df34fcdafd20ac195e588a06c8fc5a904fa71669 (diff) | |
download | lvm2-508f0f5a21af8decf32944e01ecf17c0059a9c9f.tar.gz |
libdm: add dm_report_compact_given_fields
dm_report_compact_given_fields is the same as dm_report_compact_fields,
but it processes only given fields, not all the fields in the report
like dm_report_compact_field does.
Diffstat (limited to 'libdm/libdm-report.c')
-rw-r--r-- | libdm/libdm-report.c | 62 |
1 files changed, 60 insertions, 2 deletions
diff --git a/libdm/libdm-report.c b/libdm/libdm-report.c index 681ad049b..b2e70d59e 100644 --- a/libdm/libdm-report.c +++ b/libdm/libdm-report.c @@ -81,6 +81,7 @@ struct dm_report { #define FLD_ASCENDING 0x00004000 #define FLD_DESCENDING 0x00008000 #define FLD_COMPACTED 0x00010000 +#define FLD_COMPACT_ONE 0x00020000 struct field_properties { struct dm_list list; @@ -2013,7 +2014,7 @@ out: return r; } -int dm_report_compact_fields(struct dm_report *rh) +static int _do_report_compact_fields(struct dm_report *rh, int global) { struct dm_report_field *field; struct field_properties *fp; @@ -2036,7 +2037,9 @@ int dm_report_compact_fields(struct dm_report *rh) * in next step... */ dm_list_iterate_items(fp, &rh->field_props) { - if (!(fp->flags & FLD_HIDDEN)) + if (fp->flags & FLD_HIDDEN) + continue; + if (global || (fp->flags & FLD_COMPACT_ONE)) fp->flags |= (FLD_COMPACTED | FLD_HIDDEN); } @@ -2065,6 +2068,61 @@ int dm_report_compact_fields(struct dm_report *rh) return 1; } +int dm_report_compact_fields(struct dm_report *rh) +{ + return _do_report_compact_fields(rh, 1); +} + +static int _field_to_compact_match(struct dm_report *rh, const char *field, size_t flen) +{ + struct field_properties *fp; + uint32_t f; + int implicit; + + if ((_get_field(rh, field, flen, &f, &implicit))) { + dm_list_iterate_items(fp, &rh->field_props) { + if ((fp->implicit == implicit) && (fp->field_num == f)) { + fp->flags |= FLD_COMPACT_ONE; + break; + } + } + return 1; + } + + return 0; +} + +static int _parse_fields_to_compact(struct dm_report *rh, const char *fields) +{ + const char *ws; /* Word start */ + const char *we = fields; /* Word end */ + + if (!fields) + return 1; + + while (*we) { + while (*we && *we == ',') + we++; + ws = we; + while (*we && *we != ',') + we++; + if (!_field_to_compact_match(rh, ws, (size_t) (we - ws))) { + log_error("dm_report: Unrecognized field: %.*s", (int) (we - ws), ws); + return 0; + } + } + + return 1; +} + +int dm_report_compact_given_fields(struct dm_report *rh, const char *fields) +{ + if (!_parse_fields_to_compact(rh, fields)) + return_0; + + return _do_report_compact_fields(rh, 0); +} + int dm_report_object(struct dm_report *rh, void *object) { return _do_report_object(rh, object, 1, NULL); |