chiark / gitweb /
Add mx_dump() to dump a (canonicalized) parsed macro expansion.
authorRichard Kettlewell <rjk@greenend.org.uk>
Sat, 3 May 2008 19:51:01 +0000 (20:51 +0100)
committerRichard Kettlewell <rjk@greenend.org.uk>
Sat, 3 May 2008 19:51:01 +0000 (20:51 +0100)
lib/macros.c
lib/macros.h
lib/t-macros.c

index 7cf74947af17711840966ecb544c96ff47cd2900..e6172035a635e7c766bbcca90efd4758efa4f7d6 100644 (file)
@@ -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
index 8996f57251cbdf851c45c9ea81573462fc4ab306..0b2dc0859a709ae1b6f57f33c0bac65e26ae71c5 100644 (file)
@@ -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 */
 
 
index 77164d89aef10fa79125af0374279aefb2206534..f35b925540736e8003312732747b504e2b89102a 100644 (file)
@@ -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 */
   
 
 }