*/
static const struct mx_node *mx__rewrite(const struct mx_node *m,
hash *h) {
- const struct mx_node *head = 0, **tailp = &head, *arg, *mm;
+ const struct mx_node *head = 0, **tailp = &head, *argvalue, *mm;
struct mx_node *nm;
int n;
break;
case MX_EXPANSION:
if(m->nargs == 0
- && (arg = hash_find(h, m->name))) {
+ && (argvalue = *(const struct mx_node **)hash_find(h, m->name))) {
/* This expansion has no arguments and its name matches one of the
* macro arguments. (Even if it's a valid expansion name we override
* it.) We insert its value at this point. We do NOT recursively
* We need to recreate the list structure but a shallow copy will
* suffice here.
*/
- for(mm = arg; mm; mm = mm->next) {
+ for(mm = argvalue; mm; mm = mm->next) {
nm = xmalloc(sizeof *nm);
*nm = *mm;
nm->next = 0;
/* This is some other expansion. We recursively rewrite its argument
* values according to h. */
nm = xmalloc(sizeof *nm);
- *nm = *mm;
+ *nm = *m;
for(n = 0; n < nm->nargs; ++n)
nm->args[n] = mx__rewrite(m->args[n], h);
nm->next = 0;
* duplicate argument names (and this would be the wrong place for it
* anyway); if you do that you just lose in some undefined way. */
for(n = 0; n < m->nargs; ++n)
- hash_add(h, e->args[n], m->args[n], HASH_INSERT);
+ hash_add(h, e->args[n], &m->args[n], HASH_INSERT);
/* Generate a rewritten parse tree */
m = mx__rewrite(e->definition, h);
/* Expand the result */
check_macro("sh1", "@shell{true}", "");
check_macro("sh2", "@shell{echo spong}", "spong\n");
- fprintf(stderr, "expxect error message from macro expander:\n");
+ fprintf(stderr, "expect error message from macro expander:\n");
check_macro("sh3", "@shell{echo spong;exit 3}", "spong\n");
check_macro("url1", "@urlquote{unreserved}", "unreserved");
check_macro("url2", "@urlquote{has space}", "has%20space");
check_macro("url3", "@urlquote{\xc0\xc1}", "%c0%c1");
-
+ /* Macro definitions ------------------------------------------------------ */
+
+ check_macro("macro1", "@define{m}{a b c}{@c@ @b@ @a@}@"
+ "@m{1}{2}{3}",
+ "3 2 1");
}
TEST(macros);