X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/3d7dbffd65f31f6a3f235045180bc0fbc4dc3a18..e81e4e8d1c49737e12e3ca5dba36fd1453f447bb:/lib/macros.c
diff --git a/lib/macros.c b/lib/macros.c
index 540fc45..d194ef5 100644
--- a/lib/macros.c
+++ b/lib/macros.c
@@ -2,33 +2,27 @@
* This file is part of DisOrder
* Copyright (C) 2008 Richard Kettlewell
*
- * This program is free software; you can redistribute it and/or modify
+ * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
+ * along with this program. If not, see .
*/
/** @file lib/macros.c
* @brief Macro expansion
*/
-#include
-#include "types.h"
+#include "common.h"
-#include
#include
-#include
-#include
#include
#include
#include
@@ -202,8 +196,12 @@ const struct mx_node *mx_parse(const char *filename,
* consist of alnums and '-'. We don't permit whitespace between the '@'
* and the name. */
dynstr_init(d);
- if(input == end || !isalnum((unsigned char)*input))
- fatal(0, "%s:%d: invalid expansion", filename, e->line);
+ if(input == end)
+ fatal(0, "%s:%d: invalid expansion syntax (truncated)",
+ filename, e->line);
+ if(!isalnum((unsigned char)*input))
+ fatal(0, "%s:%d: invalid expansion syntax (unexpected %#x)",
+ filename, e->line, (unsigned char)*input);
while(input < end && (isalnum((unsigned char)*input) || *input == '-'))
dynstr_append(d, *input++);
dynstr_terminate(d);
@@ -346,9 +344,7 @@ static int mx__register(unsigned flags,
e->args = args;
e->callback = callback;
e->definition = definition;
- return hash_add(expansions, name, &e,
- ((flags & EXP_TYPE_MASK) == EXP_MACRO)
- ? HASH_INSERT : HASH_INSERT_OR_REPLACE);
+ return hash_add(expansions, name, &e, HASH_INSERT_OR_REPLACE);
}
/** @brief Register a simple expansion rule
@@ -390,11 +386,13 @@ int mx_register_macro(const char *name,
const struct mx_node *definition) {
if(mx__register(EXP_MACRO, name, nargs, nargs, args, 0/*callback*/,
definition)) {
+#if 0
/* This locates the error to the definition, which may be a line or two
* beyond the @define command itself. The backtrace generated by
* mx_expand() may help more. */
error(0, "%s:%d: duplicate definition of '%s'",
definition->filename, definition->line, name);
+#endif
return -2;
}
return 0;
@@ -611,7 +609,7 @@ const struct mx_node *mx_rewritel(const struct mx_node *m,
*/
const struct mx_node *mx_rewrite(const struct mx_node *definition,
hash *h) {
- const struct mx_node *head = 0, **tailp = &head, *argvalue, *m, *mm;
+ const struct mx_node *head = 0, **tailp = &head, *argvalue, *m, *mm, **ap;
struct mx_node *nm;
int n;
@@ -626,7 +624,7 @@ const struct mx_node *mx_rewrite(const struct mx_node *definition,
break;
case MX_EXPANSION:
if(m->nargs == 0
- && (argvalue = *(const struct mx_node **)hash_find(h, m->name))) {
+ && (ap = 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
@@ -636,6 +634,7 @@ const struct mx_node *mx_rewrite(const struct mx_node *definition,
* We need to recreate the list structure but a shallow copy will
* suffice here.
*/
+ argvalue = *ap;
for(mm = argvalue; mm; mm = mm->next) {
nm = xmalloc(sizeof *nm);
*nm = *mm;