Re: head - Re: branch-1_4 patsubst bug, and missing arguments

Eric Blake <[email protected]>
Newsgroups gmane.comp.gnu.m4.patches
Message-ID <[email protected]>
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

According to Eric Blake on 8/25/2006 4:06 PM:
> 
> And with that declaration, here goes.  This patch touches a lot of files,
> but the core things it does are fix struct m4_builtin to be 0-based, add a
> bit to state when a macro must be called for side effects even when
> warning about too few arguments, then fix patsubst to be reliable, and fix
> the fallout.  There are still a number of issues in modules/m4.c that need
> porting, but I think modules/gnu.c is now fully ported.

Looking back, it doesn't make sense for a blind macro to take 0 arguments,
so I added a check for that and fixed the two macros that fell short in
this area.

2006-08-28  Eric Blake  <[email protected]>

	* m4/utility.c (m4_bad_argc): Move assertion out of hot path...
	* m4/module.c (install_builtin_table): ...to here, and add
	assertion that blind macros require arguments.
	* m4/m4module.h (struct m4_builtin): Document restrictions that
	must be met during module loading.
	* modules/gnu.c (changeresyntax, changesyntax): These are blind,
	so require an argument to avoid	triggering assertion.
	(debugfile): Tweak error message.

- --
Life is short - so eat dessert first!

Eric Blake             [email protected]
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2.1 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFE8uYX84KuGfSFAYARAg0CAJoD3z3G1sdrbJbcdUflIZ5QIE2ySACfeRDr
eRd8erHlwBoLFZUeM8it+IQ=
=t1Bj
-----END PGP SIGNATURE-----

_______________________________________________
M4-patches mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/m4-patches
m4.patch141 (text/plain, 4.8 KB)
Index: m4/m4module.h
===================================================================
RCS file: /sources/m4/m4/m4/m4module.h,v
retrieving revision 1.80
diff -u -p -r1.80 m4module.h
--- m4/m4module.h	25 Aug 2006 22:06:42 -0000	1.80
+++ m4/m4module.h	28 Aug 2006 12:41:09 -0000
@@ -44,11 +44,15 @@ typedef void   m4_builtin_func  (m4 *, m
 
 /* The value of m4_builtin flags is built from these:  */
 enum {
-  /* set if macro can handle non-text tokens, such as builtin macro tokens */
+  /* Set if macro can handle non-text tokens, such as builtin macro
+     tokens; if clear, non-text tokens are flattened to the empty
+     string before invoking the builtin.  */
   M4_BUILTIN_GROKS_MACRO	= (1 << 0),
-  /* set if macro should only be recognized with arguments */
+  /* Set if macro should only be recognized with arguments; may only
+     be set if min_args is nonzero.  */
   M4_BUILTIN_BLIND		= (1 << 1),
-  /* set if macro has side effects even when there are too few arguments */
+  /* set if macro has side effects even when there are too few
+     arguments; may only be set if min_args is nonzero.  */
   M4_BUILTIN_SIDE_EFFECT	= (1 << 2)
 };
 
@@ -58,7 +62,8 @@ struct m4_builtin
   const char *	    name;	/* name found by builtin, printed by dumpdef */
   int		    flags;	/* bitwise OR of M4_BUILTIN_* bits */
   unsigned int	    min_args;	/* 0-based minimum number of arguments */
-  unsigned int	    max_args;	/* max arguments, UINT_MAX if unlimited */
+  /* max arguments, UINT_MAX if unlimited; must be >= min_args */
+  unsigned int	    max_args;
 };
 
 struct m4_macro
Index: m4/module.c
===================================================================
RCS file: /sources/m4/m4/m4/module.c,v
retrieving revision 1.40
diff -u -p -r1.40 module.c
--- m4/module.c	25 Aug 2006 22:06:42 -0000	1.40
+++ m4/module.c	28 Aug 2006 12:41:09 -0000
@@ -145,6 +145,12 @@ install_builtin_table (m4 *context, lt_d
 	  m4_symbol_value *value = m4_symbol_value_create ();
 	  char *	   name;
 
+	  /* Sanity check that builtins meet the required interface.  */
+	  assert (bp->min_args <= bp->max_args);
+	  assert (bp->min_args > 0
+		  || (bp->flags & (M4_BUILTIN_BLIND
+				   | M4_BUILTIN_SIDE_EFFECT)) == 0);
+
 	  m4_set_symbol_value_func (value, bp->func);
 	  VALUE_HANDLE   (value)	= handle;
 	  VALUE_FLAGS    (value)	= bp->flags;
Index: m4/utility.c
===================================================================
RCS file: /sources/m4/m4/m4/utility.c,v
retrieving revision 1.45
diff -u -p -r1.45 utility.c
--- m4/utility.c	25 Aug 2006 22:06:42 -0000	1.45
+++ m4/utility.c	28 Aug 2006 12:41:09 -0000
@@ -42,9 +42,6 @@ bool
 m4_bad_argc (m4 *context, int argc, m4_symbol_value **argv,
 	     unsigned int min, unsigned int max, bool side_effect)
 {
-  assert (min <= max);
-  assert (min > 0 || ! side_effect);
-
   if (argc - 1 < min)
     {
       m4_warn (context, 0, _("Warning: %s: too few arguments: %d < %d"),
Index: modules/gnu.c
===================================================================
RCS file: /sources/m4/m4/modules/gnu.c,v
retrieving revision 1.51
diff -u -p -r1.51 gnu.c
--- modules/gnu.c	25 Aug 2006 22:06:42 -0000	1.51
+++ modules/gnu.c	28 Aug 2006 12:41:09 -0000
@@ -49,8 +49,8 @@
   BUILTIN (__line__,	false,	false,	false,	0,	0  )	\
   BUILTIN (__program__,	false,	false,	false,	0,	0  )	\
   BUILTIN (builtin,	false,	true,	false,	1,	-1 )	\
-  BUILTIN (changeresyntax,false,true,	false,	0,	1  )	\
-  BUILTIN (changesyntax,false,	true,	false,	0,	-1 )	\
+  BUILTIN (changeresyntax,false,true,	false,	1,	1  )	\
+  BUILTIN (changesyntax,false,	true,	false,	1,	-1 )	\
   BUILTIN (debugmode,	false,	false,	false,	0,	1  )	\
   BUILTIN (debugfile,	false,	false,	false,	0,	1  )	\
   BUILTIN (esyscmd,	false,	true,	true,	1,	1  )	\
@@ -349,7 +349,7 @@ m4_resyntax_encode_safe (m4 *context, co
 
 
 /**
- * changeresyntax([RESYNTAX-SPEC])
+ * changeresyntax(RESYNTAX-SPEC)
  **/
 M4BUILTIN_HANDLER (changeresyntax)
 {
@@ -360,11 +360,10 @@ M4BUILTIN_HANDLER (changeresyntax)
 }
 
 
-/* Change the current input syntax.  The function m4_set_syntax () lives
-   in syntax.c.  For compability reasons, this function is not called,
-   if not followed by a SYNTAX_OPEN.  Also, any changes to comment
-   delimiters and quotes made here will be overridden by a call to
-   `changecom' or `changequote'.  */
+/* Change the current input syntax.  The function m4_set_syntax ()
+   lives in syntax.c.  Any changes to comment delimiters and quotes
+   made here will be overridden by a call to `changecom' or
+   `changequote'.  */
 
 /**
  * changesyntax(SYNTAX-SPEC, ...)
@@ -404,7 +403,7 @@ M4BUILTIN_HANDLER (debugfile)
   if (argc == 1)
     m4_debug_set_output (context, NULL);
   else if (!m4_debug_set_output (context, M4ARG (1)))
-    m4_error (context, 0, errno, _("%s: cannot set error file: %s"),
+    m4_error (context, 0, errno, _("%s: cannot set debug file: %s"),
 	      M4ARG (0), M4ARG (1));
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.