aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/JSON.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2020-04-04 23:31:07 +0200
committerJay Berkenbilt <ejb@ql.org>2020-04-05 00:06:32 +0200
commit72464041771de52ca6b3f8bc79aea84c23af30b6 (patch)
tree8d8a309a0be0e1563542e4d16d02564440d3837a /libqpdf/JSON.cc
parent67d5ed3a64a81f9192c17dc71f02e69f60f8a1f8 (diff)
downloadqpdf-72464041771de52ca6b3f8bc79aea84c23af30b6.tar.zst
JSON: implement pattern keys in schema
Diffstat (limited to 'libqpdf/JSON.cc')
-rw-r--r--libqpdf/JSON.cc26
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)