bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: warn about conflicting skeleton-generated files


From: Joel E. Denny
Subject: Re: warn about conflicting skeleton-generated files
Date: Wed, 17 Jan 2007 21:18:23 -0500 (EST)

On Thu, 14 Dec 2006, Joel E. Denny wrote:

> 1. If the file name does not contain a `/', it's one of Bison's installed 
> skeleton files.
> 
> 2. If the file name does contain a `/', it's an absolute or relative file 
> name.  If it's relative, it's relative to where the file name was 
> specified (current working directory for the command-line, and grammar 
> file directory for the grammar file).

I committed the following to implement this.

Index: ChangeLog
===================================================================
RCS file: /sources/bison/bison/ChangeLog,v
retrieving revision 1.1667
diff -p -u -r1.1667 ChangeLog
--- ChangeLog   17 Jan 2007 18:28:30 -0000      1.1667
+++ ChangeLog   18 Jan 2007 02:05:54 -0000
@@ -1,3 +1,24 @@
+2007-01-17  Joel E. Denny  <address@hidden>
+
+       Implement support for relative and absolute skeleton file names.
+       Discussed starting at
+       <http://lists.gnu.org/archive/html/bison-patches/2006-12/msg00071.html>.
+       * doc/bison.texinfo (Decl Summary): Document in %skeleton entry.
+       (Bison Options): Document in --skeleton entry.
+       * src/output.c (output_skeleton): Use strncpy rather than strcpy since
+       full_skeleton can't necessarily hold all of pkgdatadir.
+       If the specified skeleton file name contains a `/', don't prepend
+       pkgdatadir.
+       * src/parse-gram.y (prologue_declaration): If the specified skeleton
+       file name contains a `/', prepend the grammar file directory.
+       * tests/Makefile.am (TESTSUITE_AT): Add skeletons.at.
+       * skeletons.at: New file.
+       (relative skeleton file names): New test case.
+       (installed skeleton file names): New test case.
+       * tests/testsuite.at: Include skeletons.at.
+
+       * bootstrap: Update copyright to 2007.
+
 2007-01-17  Paolo Bonzini  <address@hidden>
 
        * bootstrap: Remove occurrences of .#bootmp from the files.
Index: bootstrap
===================================================================
RCS file: /sources/bison/bison/bootstrap,v
retrieving revision 1.50
diff -p -u -r1.50 bootstrap
--- bootstrap   17 Jan 2007 18:28:30 -0000      1.50
+++ bootstrap   18 Jan 2007 02:05:54 -0000
@@ -2,7 +2,7 @@
 
 # Bootstrap this package from CVS.
 
-# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+# Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
 
 # 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
Index: doc/bison.texinfo
===================================================================
RCS file: /sources/bison/bison/doc/bison.texinfo,v
retrieving revision 1.221
diff -p -u -r1.221 bison.texinfo
--- doc/bison.texinfo   17 Jan 2007 08:44:55 -0000      1.221
+++ doc/bison.texinfo   18 Jan 2007 02:05:57 -0000
@@ -4698,11 +4698,18 @@ Require a Version of Bison}.
 @end deffn
 
 @deffn {Directive} %skeleton "@var{file}"
-Specify the skeleton to use.  You probably don't need this option unless
-you are developing Bison; you should use @code{%language} if you want to
-specify the skeleton for a different language, because it is clearer and
-because it will always choose the correct skeleton for non-deterministic
-or push parsers.
+Specify the skeleton to use.
+
+You probably don't need this option unless you are developing Bison.
+You should use @code{%language} if you want to specify the skeleton for a
+different language, because it is clearer and because it will always choose the
+correct skeleton for non-deterministic or push parsers.
+
+If @var{file} does not contain a @code{/}, @var{file} is the name of a skeleton
+file in the Bison installation directory.
+If it does, @var{file} is an absolute file name or a file name relative to the
+directory of the grammar file.
+This is similar to how most shells resolve commands.
 @end deffn
 
 @deffn {Directive} %token-table
@@ -7319,14 +7326,20 @@ Pretend that @code{%no-parser} was speci
 
 @item -S @var{file}
 @itemx address@hidden
-Specify the skeleton to use, as if @code{%skeleton} was specified
+Specify the skeleton to use, similar to @code{%skeleton}
 (@pxref{Decl Summary, , Bison Declaration Summary}).
 
-You probably don't need this option unless you are developing Bison;
-you should use @option{--language} if you want to specify the skeleton for a
+You probably don't need this option unless you are developing Bison.
+You should use @option{--language} if you want to specify the skeleton for a
 different language, because it is clearer and because it will always
 choose the correct skeleton for non-deterministic or push parsers.
 
+If @var{file} does not contain a @code{/}, @var{file} is the name of a skeleton
+file in the Bison installation directory.
+If it does, @var{file} is an absolute file name or a file name relative to the
+current working directory.
+This is similar to how most shells resolve commands.
+
 @item -k
 @itemx --token-table
 Pretend that @code{%token-table} was specified.  @xref{Decl Summary}.
Index: src/output.c
===================================================================
RCS file: /sources/bison/bison/src/output.c,v
retrieving revision 1.266
diff -p -u -r1.266 output.c
--- src/output.c        9 Jan 2007 05:24:11 -0000       1.266
+++ src/output.c        18 Jan 2007 02:05:58 -0000
@@ -492,13 +492,16 @@ output_skeleton (void)
   full_skeleton = xmalloc (pkgdatadirlen + 1
                           + (skeleton_size < sizeof m4sugar
                              ? sizeof m4sugar : skeleton_size));
-  strcpy (full_skeleton, pkgdatadir);
+  strncpy (full_skeleton, pkgdatadir, pkgdatadirlen);
   full_skeleton[pkgdatadirlen] = '/';
   strcpy (full_skeleton + pkgdatadirlen + 1, m4sugar);
   full_m4sugar = xstrdup (full_skeleton);
   strcpy (full_skeleton + pkgdatadirlen + 1, m4bison);
   full_m4bison = xstrdup (full_skeleton);
-  strcpy (full_skeleton + pkgdatadirlen + 1, skeleton);
+  if (strchr (skeleton, '/'))
+    strcpy (full_skeleton, skeleton);
+  else
+    strcpy (full_skeleton + pkgdatadirlen + 1, skeleton);
   xfclose (xfopen (full_m4sugar, "r"));
 
   /* Create an m4 subprocess connected to us via two pipes.  */
Index: src/parse-gram.y
===================================================================
RCS file: /sources/bison/bison/src/parse-gram.y,v
retrieving revision 1.116
diff -p -u -r1.116 parse-gram.y
--- src/parse-gram.y    17 Jan 2007 09:00:00 -0000      1.116
+++ src/parse-gram.y    18 Jan 2007 02:05:58 -0000
@@ -286,7 +286,30 @@ prologue_declaration:
 | "%push-parser"                { push_parser = true; pull_parser = false; }
 | "%push-pull-parser"           { push_parser = true; pull_parser = true; }
 | "%require" STRING             { version_check (&@2, $2); }
-| "%skeleton" STRING            { skeleton_arg ($2, 1, &@1); }
+| "%skeleton" STRING
+    {
+      char const *skeleton_user = $2;
+      if (strchr (skeleton_user, '/'))
+        {
+          size_t dir_length = strlen (current_file);
+          char *skeleton_build;
+          while (dir_length && current_file[dir_length - 1] != '/')
+            --dir_length;
+          while (dir_length && current_file[dir_length - 1] == '/')
+            --dir_length;
+          skeleton_build =
+            xmalloc (dir_length + 1 + strlen (skeleton_user) + 1);
+          if (dir_length > 0)
+            {
+              strncpy (skeleton_build, current_file, dir_length);
+              skeleton_build[dir_length++] = '/';
+            }
+          strcpy (skeleton_build + dir_length, skeleton_user);
+          skeleton_user = uniqstr_new (skeleton_build);
+          free (skeleton_build);
+        }
+      skeleton_arg (skeleton_user, 1, &@1);
+    }
 | "%token-table"                { token_table_flag = true; }
 | "%verbose"                    { report_flag = report_states; }
 | "%yacc"                       { yacc_flag = true; }
Index: tests/Makefile.am
===================================================================
RCS file: /sources/bison/bison/tests/Makefile.am,v
retrieving revision 1.44
diff -p -u -r1.44 Makefile.am
--- tests/Makefile.am   2 Jan 2007 02:10:42 -0000       1.44
+++ tests/Makefile.am   18 Jan 2007 02:05:58 -0000
@@ -47,7 +47,7 @@ TESTSUITE_AT = \
        local.at \
        testsuite.at \
        input.at \
-       output.at sets.at reduce.at \
+       output.at sets.at reduce.at skeletons.at \
        synclines.at headers.at actions.at conflicts.at \
        calc.at \
         torture.at existing.at regression.at \
Index: tests/skeletons.at
===================================================================
RCS file: tests/skeletons.at
diff -N tests/skeletons.at
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ tests/skeletons.at  18 Jan 2007 02:05:58 -0000
@@ -0,0 +1,143 @@
+# Checking skeleton support.                     -*- Autotest -*-
+# Copyright (C) 2007 Free Software Foundation, Inc.
+
+# 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, 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.
+
+# 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., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_BANNER([[Skeletons Support.]])
+
+## ------------------------------ ##
+## relative skeleton file names.  ##
+## ------------------------------ ##
+
+AT_SETUP([[relative skeleton file names]])
+
+AT_CHECK([[mkdir tmp]])
+
+AT_DATA([[tmp/skel.c]],
+[[m4@&address@hidden(0)d@&address@hidden
address@hidden(b4_parser_file_name@)d@&address@hidden
+b4_percent_define_get([[test]])
+m4@&address@hidden(0)
+]])
+
+AT_DATA([[skel.c]],
+[[m4@&address@hidden(0)d@&address@hidden
address@hidden(b4_parser_file_name@)d@&address@hidden
+b4_percent_define_get([[test]]) -- Local
+m4@&address@hidden(0)
+]])
+
+AT_DATA([[tmp/input-gram.y]],
+[[%skeleton "./skel.c"
+%define test "Hello World"
+%%
+start: ;
+]])
+
+AT_DATA([[input-gram.y]],
+[[%skeleton "./skel.c"
+%define test "Hello World"
+%%
+start: ;
+]])
+
+AT_DATA([[tmp/input-cmd-line.y]],
+[[%define test "Hello World"
+%%
+start: ;
+]])
+
+AT_CHECK([[bison tmp/input-gram.y]])
+AT_CHECK([[cat input-gram.tab.c]], [[0]],
+[[Hello World
+]])
+
+AT_CHECK([[bison input-gram.y]])
+AT_CHECK([[cat input-gram.tab.c]], [[0]],
+[[Hello World -- Local
+]])
+
+AT_CHECK([[bison --skeleton=tmp/skel.c tmp/input-cmd-line.y]])
+AT_CHECK([[cat input-cmd-line.tab.c]], [[0]],
+[[Hello World
+]])
+
+AT_CLEANUP
+
+
+## ------------------------------ ##
+## installed skeleton file name.  ##
+## ------------------------------ ##
+
+AT_SETUP([[installed skeleton file name]])
+
+m4_pushdef([AT_GRAM],
+[[%{
+  #include <stdio.h>
+  void yyerror (char const *msg);
+  int yylex (void);
+%}
+
+%error-verbose
+%token 'a'
+
+%%
+
+start: ;
+
+%%
+
+void
+yyerror (char const *msg)
+{
+  fprintf (stderr, "%s\n", msg);
+}
+
+int
+yylex (void)
+{
+  return 'a';
+}
+
+int
+main (void)
+{
+  return yyparse ();
+}
+]])
+
+AT_DATA([[input-cmd-line.y]],
+[AT_GRAM])
+
+AT_DATA([[input-gram.y]],
+[[%skeleton "yacc.c"]
+AT_GRAM])
+
+AT_CHECK([[bison --skeleton=yacc.c -o input-cmd-line.c input-cmd-line.y]])
+AT_COMPILE([[input-cmd-line]])
+AT_PARSER_CHECK([[./input-cmd-line]], [[1]], [],
+[[syntax error, unexpected 'a', expecting $end
+]])
+
+AT_CHECK([[bison -o input-gram.c input-gram.y]])
+AT_COMPILE([[input-gram]])
+AT_PARSER_CHECK([[./input-gram]], [[1]], [],
+[[syntax error, unexpected 'a', expecting $end
+]])
+
+m4_popdef([AT_GRAM])
+
+AT_CLEANUP
Index: tests/testsuite.at
===================================================================
RCS file: /sources/bison/bison/tests/testsuite.at,v
retrieving revision 1.32
diff -p -u -r1.32 testsuite.at
--- tests/testsuite.at  12 Dec 2006 06:47:39 -0000      1.32
+++ tests/testsuite.at  18 Jan 2007 02:05:58 -0000
@@ -1,6 +1,6 @@
 # Test suite for GNU Bison.                            -*- Autotest -*-
 
-# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2006 Free Software
+# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2006, 2007 Free Software
 # Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
@@ -34,6 +34,9 @@ m4_include([input.at])
 # Testing output file names.
 m4_include([output.at])
 
+# Testing skeleton support.
+m4_include([skeletons.at])
+
 # Testing the part of the engine that computes FOLLOW etc.
 m4_include([sets.at])
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]