char* pakfire_parser_get(PakfireParser parser, const char* namespace, const char* name);
char** pakfire_parser_get_split(PakfireParser parser,
const char* namespace, const char* name, char delim);
+char** pakfire_parser_list_namespaces(PakfireParser parser, const char* filter);
int pakfire_parser_merge(PakfireParser parser1, PakfireParser parser2);
#############################################################################*/
#include <errno.h>
+#include <fnmatch.h>
#include <linux/limits.h>
#include <regex.h>
#include <stdlib.h>
return list;
}
+PAKFIRE_EXPORT char** pakfire_parser_list_namespaces(PakfireParser parser,
+ const char* filter) {
+ char** namespaces = NULL;
+ unsigned int counter = 0;
+
+ for (unsigned int i = 0; i < parser->num_declarations; i++) {
+ struct pakfire_parser_declaration* d = parser->declarations[i];
+
+ if (filter) {
+ int r = fnmatch(filter, d->namespace, 0);
+
+ // Skip declaration if it does not match
+ if (r == FNM_NOMATCH)
+ continue;
+
+ // Check for any errors
+ else if (r > 0) {
+ ERROR(parser->pakfire, "fnmatch failed: %s\n", strerror(errno));
+ if (namespaces)
+ free(namespaces);
+
+ return NULL;
+ }
+ }
+
+ // Does this already exist on the list?
+ if (namespaces) {
+ int found = 0;
+
+ for (const char** namespace = namespaces; *namespace; namespace++) {
+ if (strcmp(d->namespace, *namespace) == 0) {
+ found = 1;
+ break;
+ }
+ }
+
+ // Skip adding if it already exists
+ if (found)
+ continue;
+ }
+
+ namespaces = reallocarray(namespaces, counter + 2, sizeof(*namespaces));
+ if (!namespaces)
+ return NULL;
+
+ // Add namespace
+ namespaces[counter++] = d->namespace;
+ }
+
+ // Terminate array
+ if (namespaces)
+ namespaces[counter] = NULL;
+
+ return namespaces;
+}
+
PAKFIRE_EXPORT int pakfire_parser_merge(PakfireParser parser1, PakfireParser parser2) {
DEBUG(parser1->pakfire, "Merging parsers %p and %p\n", parser1, parser2);
char namespace[NAME_MAX*2+1];