const char* namespace);
PakfireParser pakfire_parser_ref(PakfireParser parser);
PakfireParser pakfire_parser_unref(PakfireParser parser);
-int pakfire_parser_set_declaration(PakfireParser parser,
+PakfireParser pakfire_parser_get_parent(PakfireParser parser);
+
+int pakfire_parser_set(PakfireParser parser,
const char* name, const char* value);
-int pakfire_parser_append_declaration(PakfireParser parser,
+int pakfire_parser_append(PakfireParser parser,
const char* name, const char* value);
-char* pakfire_parser_expand(PakfireParser parser,
- const char* namespace, const char* value);
+char* pakfire_parser_expand(PakfireParser parser, const char* value);
char* pakfire_parser_get(PakfireParser parser, const char* name);
PakfireParser pakfire_parser_merge(PakfireParser parser1, PakfireParser parser2);
pakfire_packagelist_unref;
# parser
+ pakfire_parser_append;
pakfire_parser_create;
pakfire_parser_dump;
pakfire_parser_expand;
pakfire_parser_get;
+ pakfire_parser_get_parent;
pakfire_parser_parse_data;
pakfire_parser_read;
pakfire_parser_ref;
+ pakfire_parser_set;
pakfire_parser_unref;
# problem
};
static char* pakfire_parser_make_namespace(PakfireParser parent, const char* namespace) {
- if (!namespace)
- namespace = "";
+ char* buffer = NULL;
+
+ if (parent && parent->namespace) {
+ if (namespace)
+ asprintf(&buffer, "%s.%s", parent->namespace, namespace);
+ else
+ buffer = pakfire_strdup(parent->namespace);
+ } else {
+ if (namespace)
+ buffer = pakfire_strdup(namespace);
+ }
+
+ return buffer;
+}
+static char* pakfire_parser_make_canonical_name(PakfireParser parser, const char* name) {
char* buffer = NULL;
- if (parent && *parent->namespace)
- asprintf(&buffer, "%s.%s", parent->namespace, namespace);
- else
- buffer = pakfire_strdup(namespace);
+ if (parser->namespace) {
+ int r = asprintf(&buffer, "%s.%s", parser->namespace, name);
+ if (r < 0)
+ return NULL;
+ } else {
+ buffer = pakfire_strdup(name);
+ }
return buffer;
}
pakfire_parser_unref(parser->parent);
pakfire_unref(parser->pakfire);
- pakfire_free(parser->namespace);
+ if (parser->namespace)
+ pakfire_free(parser->namespace);
pakfire_free(parser);
}
return NULL;
}
+PAKFIRE_EXPORT PakfireParser pakfire_parser_get_parent(PakfireParser parser) {
+ if (parser->parent)
+ return pakfire_parser_ref(parser->parent);
+
+ return NULL;
+}
+
static struct pakfire_parser_declaration* pakfire_parser_get_declaration(
PakfireParser parser, const char* name) {
struct pakfire_parser_declaration* d;
return NULL;
}
-PAKFIRE_EXPORT int pakfire_parser_set_declaration(PakfireParser parser,
+static int pakfire_parser_set_declaration(PakfireParser parser,
const char* name, const char* value) {
// Handle when name already exists
struct pakfire_parser_declaration* d = pakfire_parser_get_declaration(parser, name);
return 0;
}
-PAKFIRE_EXPORT int pakfire_parser_append_declaration(PakfireParser parser,
+PAKFIRE_EXPORT int pakfire_parser_set(PakfireParser parser, const char* name, const char* value) {
+ char* canonical_name = pakfire_parser_make_canonical_name(parser, name);
+
+ int r = pakfire_parser_set_declaration(parser, canonical_name, value);
+ pakfire_free(canonical_name);
+
+ return r;
+}
+
+PAKFIRE_EXPORT int pakfire_parser_append(PakfireParser parser,
const char* name, const char* value) {
struct pakfire_parser_declaration* d = pakfire_parser_get_declaration(parser, name);
}
static struct pakfire_parser_declaration* pakfire_parser_find_declaration(
- PakfireParser parser, const char* namespace, const char* name) {
+ PakfireParser parser, const char* name) {
// Create a working copy of the namespace
- char* n = pakfire_strdup(namespace);
+ char* n = pakfire_strdup(parser->namespace);
size_t length = strlen(n) + strlen(name) + 1;
char* buffer = pakfire_malloc(length + 1);
pakfire_parser_strip_namespace(namespace);
// Expand the value
- char* buffer = pakfire_parser_expand(parser, namespace, declaration->value);
+ char* buffer = pakfire_parser_expand(parser, declaration->value);
// Cleanup
pakfire_free(namespace);
return buffer;
}
-PAKFIRE_EXPORT char* pakfire_parser_expand(PakfireParser parser,
- const char* namespace, const char* value) {
+PAKFIRE_EXPORT char* pakfire_parser_expand(PakfireParser parser, const char* value) {
// Return NULL when the value is NULL
if (!value)
return NULL;
// Search for a declaration of this variable
struct pakfire_parser_declaration* v =
- pakfire_parser_find_declaration(parser, namespace, variable);
+ pakfire_parser_find_declaration(parser, variable);
const char* value = NULL;
if (v && v->value) {
static void cleanup(void);
#define ABORT do { cleanup(); YYABORT; } while (0);
-char* current_block = NULL;
-static char* pakfire_parser_make_canonical_name(const char* name);
-
enum operator {
OP_EQUALS = 0,
};
-static PakfireParser new_parser(PakfireParser parent);
+static PakfireParser new_parser(PakfireParser parent, const char* namespace);
static PakfireParser merge_parsers(PakfireParser p1, PakfireParser p2);
static PakfireParser make_if_stmt(PakfireParser parser, const enum operator op,
top : %empty
{
- $$ = new_parser(parser);
+ $$ = new_parser(parser, NULL);
}
| top assignment
{
block_opening : variable T_EOL
{
- current_block = pakfire_strdup($1);
+ // Create a new sub-parser which opens a new namespace
+ parser = new_parser(parser, $1);
};
block_closing : end
{
- pakfire_free(current_block);
- current_block = NULL;
+ // Move back to the parent parser
+ parser = pakfire_parser_get_parent(parser);
};
block : block_opening block_assignments block_closing
if ($1)
$$ = $1;
else
- $$ = new_parser(parser);
+ $$ = new_parser(parser, NULL);
};
block_assignment : assignment
assignment : variable T_ASSIGN value T_EOL
{
- char* name = pakfire_parser_make_canonical_name($1);
- if (!name)
- ABORT;
-
// Allocate a new parser
- // XXX should not inherit from parser
- $$ = new_parser(parser);
-
- int r = pakfire_parser_set_declaration($$, name, $3);
- pakfire_free(name);
+ $$ = new_parser(parser, NULL);
+ int r = pakfire_parser_set($$, $1, $3);
if (r < 0) {
pakfire_parser_unref($$);
ABORT;
}
| variable T_APPEND value T_EOL
{
- char* name = pakfire_parser_make_canonical_name($1);
- if (!name)
- ABORT;
-
// Allocate a new parser
- // XXX should not inherit from parser
- $$ = new_parser(parser);
-
- int r = pakfire_parser_append_declaration($$, name, $3);
- pakfire_free(name);
+ $$ = new_parser(parser, NULL);
+ int r = pakfire_parser_append($$, $1, $3);
if (r < 0) {
pakfire_parser_unref($$);
ABORT;
}
| define text end
{
- char* name = pakfire_parser_make_canonical_name($1);
- if (!name)
- ABORT;
-
// Allocate a new parser
- // XXX should not inherit from parser
- $$ = new_parser(parser);
-
- int r = pakfire_parser_set_declaration($$, name, $2);
- pakfire_free(name);
+ $$ = new_parser(parser, NULL);
+ int r = pakfire_parser_set($$, $1, $2);
if (r < 0) {
pakfire_parser_unref($$);
ABORT;
%%
static void cleanup(void) {
- // Reset current_block
- if (current_block) {
- pakfire_free(current_block);
- current_block = NULL;
- }
-}
-
-static char* pakfire_parser_make_canonical_name(const char* name) {
- char* buffer = NULL;
-
- if (current_block) {
- int r = asprintf(&buffer, "%s.%s", current_block, name);
- if (r < 0)
- return NULL;
- } else {
- buffer = pakfire_strdup(name);
- }
-
- return buffer;
}
int pakfire_parser_parse_data(PakfireParser parent, const char* data, size_t len) {
pakfire_unref(pakfire);
}
-static PakfireParser new_parser(PakfireParser parent) {
+static PakfireParser new_parser(PakfireParser parent, const char* namespace) {
Pakfire pakfire = pakfire_parser_get_pakfire(parent);
- PakfireParser parser = pakfire_parser_create(pakfire, parent, current_block);
+ PakfireParser parser = pakfire_parser_create(pakfire, parent, namespace);
pakfire_unref(pakfire);
return parser;
break;
}
- const char* namespace = (current_block) ? current_block : "";
-
// Expand values
- char* v1 = pakfire_parser_expand(parser, namespace, val1);
- char* v2 = pakfire_parser_expand(parser, namespace, val2);
+ char* v1 = pakfire_parser_expand(parser, val1);
+ char* v2 = pakfire_parser_expand(parser, val2);
PakfireParser result = NULL;