diff options
author | Jay Berkenbilt <ejb@ql.org> | 2020-04-04 23:31:07 +0200 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2020-04-05 00:06:32 +0200 |
commit | 72464041771de52ca6b3f8bc79aea84c23af30b6 (patch) | |
tree | 8d8a309a0be0e1563542e4d16d02564440d3837a /libqpdf/JSON.cc | |
parent | 67d5ed3a64a81f9192c17dc71f02e69f60f8a1f8 (diff) | |
download | qpdf-72464041771de52ca6b3f8bc79aea84c23af30b6.tar.zst |
JSON: implement pattern keys in schema
Diffstat (limited to 'libqpdf/JSON.cc')
-rw-r--r-- | libqpdf/JSON.cc | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/libqpdf/JSON.cc b/libqpdf/JSON.cc index 8565a831..247d3c86 100644 --- a/libqpdf/JSON.cc +++ b/libqpdf/JSON.cc @@ -323,6 +323,7 @@ JSON::checkSchemaInternal(JSON_value* this_v, JSON_value* sch_v, err_prefix = "json key \"" + prefix + "\""; } + std::string pattern_key; if (sch_dict) { if (! this_dict) @@ -331,6 +332,31 @@ JSON::checkSchemaInternal(JSON_value* this_v, JSON_value* sch_v, errors.push_back(err_prefix + " is supposed to be a dictionary"); return false; } + auto members = sch_dict->members; + std::string key; + if ((members.size() == 1) && + ((key = members.begin()->first, key.length() > 2) && + (key.at(0) == '<') && + (key.at(key.length() - 1) == '>'))) + { + pattern_key = key; + } + } + + if (sch_dict && (! pattern_key.empty())) + { + auto pattern_schema = sch_dict->members[pattern_key].getPointer(); + for (auto iter: this_dict->members) + { + std::string const& key = iter.first; + checkSchemaInternal( + this_dict->members[key].getPointer(), + pattern_schema, + errors, prefix + "." + key); + } + } + else if (sch_dict) + { for (std::map<std::string, PointerHolder<JSON_value> >::iterator iter = sch_dict->members.begin(); iter != sch_dict->members.end(); ++iter) |