+/** \brief Parse attributes of an application element. */
+static void
+parseEngineAttr(struct OptConfData *data, const XML_Char **attr)
+{
+ uint32_t i;
+ const XML_Char *engine_name_match = NULL, *engine_versions = NULL;
+ driOptionInfo version_ranges = {
+ .type = DRI_INT,
+ };
+ for (i = 0; attr[i]; i += 2) {
+ if (!strcmp (attr[i], "name")) /* not needed here */;
+ else if (!strcmp (attr[i], "engine_name_match")) engine_name_match = attr[i+1];
+ else if (!strcmp (attr[i], "engine_versions")) engine_versions = attr[i+1];
+ else XML_WARNING("unknown application attribute: %s.", attr[i]);
+ }
+ if (engine_name_match) {
+ regex_t re;
+
+ if (regcomp (&re, engine_name_match, REG_EXTENDED|REG_NOSUB) != 0) {
+ if (regexec (&re, data->engineName, 0, NULL, 0) == REG_NOMATCH)
+ data->ignoringApp = data->inApp;
+ regfree (&re);
+ } else
+ XML_WARNING ("Invalid engine_name_match=\"%s\".", engine_name_match);
+ }
+ if (engine_versions) {
+ if (parseRanges (&version_ranges, engine_versions) &&
+ !valueInRanges (&version_ranges, data->engineVersion))
+ data->ignoringApp = data->inApp;
+ }
+
+ free(version_ranges.ranges);
+}
+