* src/output.c (is_identifier): New.
(symbol_definitions_output): Use it to define tag_is_id.
But maybe this should be done at m4 level?
+2008-11-11 Akim Demaille <demaille@gostai.com>
+
+ Inform m4 whether a tag is a valid id.
+ * src/output.c (is_identifier): New.
+ (symbol_definitions_output): Use it to define tag_is_id.
+ But maybe this should be done at m4 level?
+
2008-11-11 Akim Demaille <demaille@gostai.com>
Test 214 was failing: it greps with a pattern containing [ ]*
2008-11-11 Akim Demaille <demaille@gostai.com>
Test 214 was failing: it greps with a pattern containing [ ]*
+/*----------------------------------.
+| Whether S is a valid identifier. |
+`----------------------------------*/
+
+static bool
+is_identifier (uniqstr s)
+{
+ static char const alphanum[26 + 26 + 1 + 10] =
+ "abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "_"
+ "0123456789";
+ if (!s || ! memchr (alphanum, *s, sizeof alphanum - 10))
+ return false;
+ for (++s; *s; ++s)
+ if (! memchr (alphanum, *s, sizeof alphanum))
+ return false;
+ return true;
+}
+
/*---------------------------------------.
| Output the symbol definitions to OUT. |
`---------------------------------------*/
/*---------------------------------------.
| Output the symbol definitions to OUT. |
`---------------------------------------*/
obstack_1grow (&format_obstack, 0); \
key = obstack_finish (&format_obstack);
obstack_1grow (&format_obstack, 0); \
key = obstack_finish (&format_obstack);
+ // Whether the tag is a valid identifier.
+ SET_KEY("tag_is_id");
+ MUSCLE_INSERT_INT (key, is_identifier(sym->tag));
+
+ // The inner tag.
SET_KEY("tag");
MUSCLE_INSERT_STRING (key, sym->tag);
SET_KEY("tag");
MUSCLE_INSERT_STRING (key, sym->tag);