#############################################################################*/
#include <errno.h>
+#include <linux/limits.h>
#include <regex.h>
#include <stdlib.h>
#include <string.h>
struct pakfire_parser_declaration* d = parser->declarations[i];
// Free everything
- if (d->namespace)
- free(d->namespace);
- if (d->name)
- free(d->name);
if (d->value)
free(d->value);
free(d);
static struct pakfire_parser_declaration* pakfire_parser_get_declaration(
PakfireParser parser, const char* namespace, const char* name) {
- struct pakfire_parser_declaration* d;
+ if (!name) {
+ errno = EINVAL;
+ return NULL;
+ }
+
+ if (!namespace)
+ namespace = "";
+ struct pakfire_parser_declaration* d;
for (unsigned i = 0; i < parser->num_declarations; i++) {
d = parser->declarations[i];
if (!d)
break;
- // Skip if d does not have a namespace set
- if (namespace && !d->namespace)
- continue;
-
- // Skip if namespace does not match
- if (namespace && strcmp(d->namespace, namespace) != 0)
- continue;
-
- // Compare the name
- if (strcmp(d->name, name) == 0)
+ // Return if namespace and name match
+ if ((strcmp(d->namespace, namespace) == 0) && (strcmp(d->name, name) == 0))
return d;
}
if (!name)
return -EINVAL;
+ if (!namespace)
+ namespace = "";
+
// Handle when name already exists
struct pakfire_parser_declaration* d = pakfire_parser_get_declaration(parser, namespace, name);
if (d) {
if (!d)
return -1;
- // Copy namespace
- if (namespace)
- d->namespace = strdup(namespace);
- else
- d->namespace = NULL;
+ // Store namespace
+ pakfire_string_set(d->namespace, namespace);
// Import name & value
- d->name = strdup(name);
+ pakfire_string_set(d->name, name);
if (value)
d->value = strdup(value);
if (pos)
*s[pos - *s] = '\0';
else
- *s = NULL;
+ *s[0] = '\0';
}
static struct pakfire_parser_declaration* pakfire_parser_find_declaration(
PakfireParser parser, const char* namespace, const char* name) {
- char* n = NULL;
+ char* n = "";
// Create a working copy of the namespace variable
if (namespace)
break;
// End if namespace is empty
- if (!n)
+ if (!n || !*n)
break;
/*
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];
// Do not try to merge a parser with itself
if (parser1 == parser2)
return EINVAL;
- char* namespace = NULL;
-
for (unsigned int i = 0; i < parser2->num_declarations; i++) {
struct pakfire_parser_declaration* d = parser2->declarations[i];
if (!d)
break;
- if (parser2->namespace && d->namespace)
- asprintf(&namespace, "%s.%s", parser2->namespace, d->namespace);
+ if (parser2->namespace && *d->namespace)
+ pakfire_string_format(namespace, "%s.%s", parser2->namespace, d->namespace);
else if (parser2->namespace)
- asprintf(&namespace, "%s", parser2->namespace);
- else if (d->namespace)
- asprintf(&namespace, "%s", d->namespace);
+ pakfire_string_set(namespace, parser2->namespace);
+ else if (*d->namespace)
+ pakfire_string_set(namespace, d->namespace);
else
- namespace = NULL;
+ pakfire_string_set(namespace, "");
int r = pakfire_parser_set(parser1, namespace, d->name, d->value);
-
- if (namespace)
- free(namespace);
-
if (r)
return r;
}
}
PAKFIRE_EXPORT char* pakfire_parser_dump(PakfireParser parser) {
+ char buffer[NAME_MAX*2 + 1];
char* s = NULL;
- char buffer[1024];
-
for (unsigned int i = 0; i < parser->num_declarations; i++) {
struct pakfire_parser_declaration* d = parser->declarations[i];
if (d) {
- if (d->namespace)
- snprintf(buffer, sizeof(buffer) - 1, "%s.%s", d->namespace, d->name);
+ if (*d->namespace)
+ pakfire_string_format(buffer, "%s.%s", d->namespace, d->name);
else
- snprintf(buffer, sizeof(buffer) - 1, "%s", d->name);
+ pakfire_string_set(buffer, d->name);
asprintf(&s, "%s%-24s = %s\n", (s) ? s : "", buffer, d->value);
}
static PakfireParser make_if_stmt(Pakfire pakfire, PakfireParser* parser, const enum operator op,
const char* val1, const char* val2, PakfireParser if_block, PakfireParser else_block);
-static inline int pakfire_parser_new_declaration(
+static int pakfire_parser_new_declaration(
struct pakfire_parser_declaration** declaration, const char* name, const char* value, int flags) {
if (!name)
return EINVAL;
- struct pakfire_parser_declaration* d = malloc(sizeof(*d));
+ struct pakfire_parser_declaration* d = calloc(1, sizeof(*d));
if (!d)
return ENOMEM;
- // Set namespace
- d->namespace = NULL;
-
- // Copy name
- d->name = strdup(name);
+ // Set name
+ pakfire_string_set(d->name, name);
// Copy value
if (value)
}
static void pakfire_parser_free_declaration(struct pakfire_parser_declaration* declaration) {
- free(declaration->name);
-
if (declaration->value)
free(declaration->value);