This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: cpplib: Command line assertions made easier


Zack Weinberg wrote:-

> And there was much rejoicing.
> 
> Maybe you could point out the advantage of the new syntax in the cpp
> documentation?

Heh.  I've removed the old format from the heading.  Doing that, I
noticed that -A-, the command line equivalent of #unassert, takes the
same syntax.  So that needs a doc update and code update too.

So a final diff is below, with updated tests.

Neil.

	* cpp.texi: Update for new command line assertion syntax.
	* cpplib.c (cpp_define): Simplify a bit.
	(cpp_assert, cpp_unassert): Use handle_assertion.
	(handle_assertion): New function; accept new command line
	syntax with '='.
	* testsuite/gcc.dg/cpp/assert3.c: New tests.

Index: cpp.texi
===================================================================
RCS file: /cvs/gcc/egcs/gcc/cpp.texi,v
retrieving revision 1.34
diff -u -p -r1.34 cpp.texi
--- cpp.texi	2000/10/27 23:50:15	1.34
+++ cpp.texi	2000/10/31 23:15:21
@@ -3364,12 +3364,14 @@ Define the macros @var{__GNUC__}, @var{_
 @var{__GNUC_PATCHLEVEL__}. These are defined automatically when you use
 @samp{gcc -E}; you can turn them off in that case with @samp{-no-gcc}.
 
-@item -A @var{predicate}(@var{answer})
+@item -A @var{predicate}=@var{answer}
 @findex -A
 Make an assertion with the predicate @var{predicate} and answer
-@var{answer}.  @xref{Assertions}.
+@var{answer}.  This form is preferred to the older form @samp{-A
+@var{predicate}(@var{answer})}, which is still supported, because
+it does not use shell special characters.  @xref{Assertions}.
 
-@item -A -@var{predicate}(@var{answer})
+@item -A -@var{predicate}=@var{answer}
 Disable an assertion with the predicate @var{predicate} and answer
 @var{answer}.  Specifying no predicate, by @samp{-A-} or @samp{-A -},
 disables all predefined assertions and all assertions preceding it on
Index: cpplib.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/cpplib.c,v
retrieving revision 1.211
diff -u -p -r1.211 cpplib.c
--- cpplib.c	2000/10/30 22:28:59	1.211
+++ cpplib.c	2000/10/31 23:15:24
@@ -107,6 +107,7 @@ static cpp_hashnode *parse_assertion PAR
 					      int));
 static struct answer ** find_answer PARAMS ((cpp_hashnode *,
 					     const struct answer *));
+static void handle_assertion	PARAMS ((cpp_reader *, const char *, int));
 
 /* This is the table of directive handlers.  It is ordered by
    frequency of occurrence; the numbers at the end are directive
@@ -1608,29 +1609,25 @@ cpp_define (pfile, str)
   char *buf, *p;
   size_t count;
 
-  p = strchr (str, '=');
   /* Copy the entire option so we can modify it. 
      Change the first "=" in the string to a space.  If there is none,
-     tack " 1" on the end.  Then add a newline and a NUL.  */
-  
+     tack " 1" on the end.  */
+
+  /* Length including the null.  */  
+  count = strlen (str);
+  buf = (char *) alloca (count + 2);
+  memcpy (buf, str, count);
+
+  p = strchr (str, '=');
   if (p)
-    {
-      count = strlen (str) + 2;
-      buf = (char *) alloca (count);
-      memcpy (buf, str, count - 2);
-      buf[p - str] = ' ';
-      buf[count - 2] = '\n';
-      buf[count - 1] = '\0';
-    }
+    buf[p - str] = ' ';
   else
     {
-      count = strlen (str) + 4;
-      buf = (char *) alloca (count);
-      memcpy (buf, str, count - 4);
-      strcpy (&buf[count-4], " 1\n");
+      buf[count++] = ' ';
+      buf[count++] = '1';
     }
 
-  run_directive (pfile, T_DEFINE, buf, count - 1, 0);
+  run_directive (pfile, T_DEFINE, buf, count, 0);
 }
 
 /* Slight variant of the above for use by initialize_builtins, which (a)
@@ -1659,7 +1656,7 @@ cpp_assert (pfile, str)
      cpp_reader *pfile;
      const char *str;
 {
-  run_directive (pfile, T_ASSERT, str, strlen (str), 0);
+  handle_assertion (pfile, str, T_ASSERT);
 }
 
 /* Process STR as if it appeared as the body of an #unassert. */
@@ -1668,8 +1665,33 @@ cpp_unassert (pfile, str)
      cpp_reader *pfile;
      const char *str;
 {
-  run_directive (pfile, T_UNASSERT, str, strlen (str), 0);
+  handle_assertion (pfile, str, T_UNASSERT);
 }  
+
+/* Common code for cpp_assert (-A) and cpp_unassert (-A-).  */
+static void
+handle_assertion (pfile, str, type)
+     cpp_reader *pfile;
+     const char *str;
+     int type;
+{
+  size_t count = strlen (str);
+  const char *p = strchr (str, '=');
+
+  if (p)
+    {
+      /* Copy the entire option so we can modify it.  Change the first
+	 "=" in the string to a '(', and tack a ')' on the end.  */
+      char *buf = (char *) alloca (count + 1);
+
+      memcpy (buf, str, count);
+      buf[p - str] = '(';
+      buf[count++] = ')';
+      str = buf;
+    }
+
+  run_directive (pfile, type, str, count, 0);
+}
 
 /* Determine whether the identifier ID, of length LEN, is a defined macro.  */
 int
Index: testsuite/gcc.dg/cpp/assert3.c
===================================================================
RCS file: assert3.c
diff -N assert3.c
--- /dev/null	Tue May  5 13:32:27 1998
+++ assert3.c	Tue Oct 31 15:15:24 2000
@@ -0,0 +1,10 @@
+/* Copyright (C) 2000 Free Software Foundation, Inc.  */
+
+/* { dg-do preprocess } */
+/* { dg-options "-A abc=def -A abc\(ghi\) \"-Aabc = jkl\" -A abc=mno -A -abc=mno" } */
+
+/* Test -A command line syntax.  Source Neil Booth.  31 Oct 2000.  */
+
+#if !#abc (def) || !#abc (ghi) || !#abc (jkl) || #abc(mno)
+#error Command line -A assertions
+#endif

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]