From 9dbb630e213c2fc6e5f4ff078eb972d270aec84c Mon Sep 17 00:00:00 2001 Message-Id: <9dbb630e213c2fc6e5f4ff078eb972d270aec84c.1714808016.git.mdw@distorted.org.uk> From: Mark Wooding Date: Sat, 3 May 2008 20:51:01 +0100 Subject: [PATCH] Add mx_dump() to dump a (canonicalized) parsed macro expansion. Organization: Straylight/Edgeware From: Richard Kettlewell --- lib/macros.c | 35 +++++++++++++++++++++++++++++++++++ lib/macros.h | 2 ++ lib/t-macros.c | 12 ++++++++++++ 3 files changed, 49 insertions(+) diff --git a/lib/macros.c b/lib/macros.c index 7cf7494..e617203 100644 --- a/lib/macros.c +++ b/lib/macros.c @@ -201,6 +201,41 @@ const struct mx_node *mx_parse(const char *filename, return head; } +static void mx__dump(struct dynstr *d, const struct mx_node *m) { + int n; + + if(!m) + return; + switch(m->type) { + case MX_TEXT: + dynstr_append_string(d, m->text); + break; + case MX_EXPANSION: + dynstr_append(d, '@'); + dynstr_append_string(d, m->name); + for(n = 0; n < m->nargs; ++n) { + dynstr_append(d, '{'); + mx__dump(d, m->args[n]); + dynstr_append(d, '}'); + } + dynstr_append(d, '@'); + break; + default: + assert(!"invalid m->type"); + } + mx__dump(d, m->next); +} + +/** @brief Dump a parse macro expansion to a string */ +char *mx_dump(const struct mx_node *m) { + struct dynstr d[1]; + + dynstr_init(d); + mx__dump(d, m); + dynstr_terminate(d); + return d->vec; +} + /* Local Variables: c-basic-offset:2 diff --git a/lib/macros.h b/lib/macros.h index 8996f57..0b2dc08 100644 --- a/lib/macros.h +++ b/lib/macros.h @@ -63,6 +63,8 @@ const struct mx_node *mx_parse(const char *filename, const char *input, const char *end); +char *mx_dump(const struct mx_node *m); + #endif /* MACROS_H */ diff --git a/lib/t-macros.c b/lib/t-macros.c index 77164d8..f35b925 100644 --- a/lib/t-macros.c +++ b/lib/t-macros.c @@ -37,6 +37,7 @@ static void test_macros(void) { insist(m->line == 1); check_string(m->text, L1 L2); insist(m->next == 0); + check_string(mx_dump(m), plain); /* Check that partial parses stop in the right place */ m = mx_parse("plaintext2", 5, plain, plain + strlen(L1)); @@ -45,6 +46,7 @@ static void test_macros(void) { insist(m->line == 5); check_string(m->text, L1); insist(m->next == 0); + check_string(mx_dump(m), L1); /* The simplest possible expansion */ m = mx_parse("macro1", 1, "@macro@", NULL); @@ -55,6 +57,7 @@ static void test_macros(void) { insist(m->nargs == 0); insist(m->args == 0); insist(m->next == 0); + check_string(mx_dump(m), "@macro@"); /* Spacing variants of the above */ m = mx_parse("macro2", 1, "@ macro@", NULL); @@ -65,6 +68,7 @@ static void test_macros(void) { insist(m->nargs == 0); insist(m->args == 0); insist(m->next == 0); + check_string(mx_dump(m), "@macro@"); m = mx_parse("macro3", 1, "@macro @", NULL); insist(m->type == MX_EXPANSION); check_string(m->filename, "macro3"); @@ -73,6 +77,7 @@ static void test_macros(void) { insist(m->nargs == 0); insist(m->args == 0); insist(m->next == 0); + check_string(mx_dump(m), "@macro@"); /* Unterminated variants */ m = mx_parse("macro4", 1, "@macro", NULL); @@ -83,6 +88,7 @@ static void test_macros(void) { insist(m->nargs == 0); insist(m->args == 0); insist(m->next == 0); + check_string(mx_dump(m), "@macro@"); m = mx_parse("macro5", 1, "@macro ", NULL); insist(m->type == MX_EXPANSION); check_string(m->filename, "macro5"); @@ -91,6 +97,7 @@ static void test_macros(void) { insist(m->nargs == 0); insist(m->args == 0); insist(m->next == 0); + check_string(mx_dump(m), "@macro@"); /* Macros with a :-separated argument */ m = mx_parse("macro5", 1, "@macro:arg@", NULL); @@ -107,6 +114,8 @@ static void test_macros(void) { check_string(m->args[0]->text, "arg"); insist(m->args[0]->next == 0); + check_string(mx_dump(m), "@macro{arg}@"); + /* Multiple :-separated arguments, and spacing, and newlines */ m = mx_parse("macro6", 1, "@macro : \n arg1 : \n arg2@", NULL); insist(m->type == MX_EXPANSION); @@ -128,6 +137,9 @@ static void test_macros(void) { check_string(m->args[1]->text, "arg2"); insist(m->args[1]->next == 0); + check_string(mx_dump(m), "@macro{arg1}{arg2}@"); + + /* Multiple bracketed arguments */ } -- [mdw]