freedreno/rnn: add schema validation

Now that all the schema validation issues are fixed, enable xml
validation according to stylesheet in rnn.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6107>
This commit is contained in:
Rob Clark 2020-07-28 09:15:05 -07:00 committed by Marge Bot
parent 3169b8c645
commit aa89693c02
1 changed files with 52 additions and 0 deletions

View File

@ -866,6 +866,54 @@ static char * find_file(const char *file_orig)
return fname;
}
static int validate_doc(struct rnndb *db, xmlDocPtr doc, xmlNodePtr database)
{
/* find the schemaLocation property: */
xmlAttrPtr attr = database->properties;
const char *schema_name = NULL;
char *schema_path;
while (attr) {
if (!strcmp(attr->name, "schemaLocation")) {
xmlNodePtr data = attr->children;
schema_name = data->content;
/* we expect this to look like <namespace url> schema.xsd.. I think
* technically it is supposed to be just a URL, but that doesn't
* quite match up to what we do.. Just skip over everything up to
* and including the first whitespace character:
*/
while (schema_name && (schema_name[0] != ' '))
schema_name++;
schema_name++;
break;
}
}
if (!schema_name) {
rnn_err(db, "could not find schema. Missing schemaLocation?");
return 0;
}
schema_path = find_file(schema_name);
if (!schema_path) {
rnn_err(db, "%s: couldn't find database file. Please set the env var RNN_PATH.\n", schema_name);
return 0;
}
xmlSchemaParserCtxtPtr parser = xmlSchemaNewParserCtxt(schema_path);
xmlSchemaPtr schema = xmlSchemaParse(parser);
xmlSchemaValidCtxtPtr validCtxt = xmlSchemaNewValidCtxt(schema);
int ret = xmlSchemaValidateDoc(validCtxt, doc);
xmlSchemaFreeValidCtxt(validCtxt);
xmlSchemaFree(schema);
xmlSchemaFreeParserCtxt(parser);
free(schema_path);
return ret;
}
void rnn_parsefile (struct rnndb *db, char *file_orig) {
int i;
char *fname;
@ -893,6 +941,10 @@ void rnn_parsefile (struct rnndb *db, char *file_orig) {
rnn_err(db, "%s:%d: wrong top-level tag <%s>\n", fname, root->line, root->name);
} else {
xmlNode *chain = root->children;
if (validate_doc(db, doc, root)) {
rnn_err(db, "%s: database file has errors\n", fname);
return;
}
while (chain) {
if (chain->type != XML_ELEMENT_NODE) {
} else if (!trytop(db, fname, chain) && !trydoc(db, fname, chain)) {