* ylwrap: Don't use a full path name if the source file is in the
authorIan Lance Taylor <ian@airs.com>
Fri, 17 Jul 1998 18:52:26 +0000 (18:52 +0000)
committerIan Lance Taylor <ian@airs.com>
Fri, 17 Jul 1998 18:52:26 +0000 (18:52 +0000)
same directory.  From hjl@lucon.org (H.J. Lu).

ChangeLog
ylwrap [new file with mode: 0755]

index d27d2d256ccfedd398a6e687ea3239d8148b6eda..3cd627d62e3ec50684f28ecac5d14c127606699e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 Fri Jul 17 13:30:18 1998  Ian Lance Taylor  <ian@cygnus.com>
 
+       * ylwrap: Don't use a full path name if the source file is in the
+       same directory.  From hjl@lucon.org (H.J. Lu).
+
        * config-ml.in: Default to being verbose, to match Feb 18 change to
        configure.
 
diff --git a/ylwrap b/ylwrap
new file mode 100755 (executable)
index 0000000..2d0f97f
--- /dev/null
+++ b/ylwrap
@@ -0,0 +1,123 @@
+#! /bin/sh
+# ylwrap - wrapper for lex/yacc invocations.
+# Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+# Usage:
+#     ylwrap PROGRAM INPUT [OUTPUT DESIRED]... -- [ARGS]...
+# * PROGRAM is program to run.
+# * INPUT is the input file
+# * OUTPUT is file PROG generates
+# * DESIRED is file we actually want
+# * ARGS are passed to PROG
+# Any number of OUTPUT,DESIRED pairs may be used.
+
+# The program to run.
+prog="$1"
+shift
+# Make any relative path in $prog absolute.
+case "$prog" in
+ /*) ;;
+ */*) prog="`pwd`/$prog" ;;
+esac
+
+# The input.
+input="$1"
+shift
+case "$input" in
+ /* | [A-Za-z]:\\*)
+    # Absolute path; do nothing.
+    ;;
+ *)
+    # Relative path.  Make it absolute.  Why?  Because otherwise any
+    # debugging info in the generated file will point to the wrong
+    # place.  This is really gross.
+    input="`pwd`/$input"
+    ;;
+esac
+
+# We don't want to use the absolute path if the input in the current
+# directory like when making a tar ball.
+input_base=`echo $input | sed -e 's|.*/||'`
+if test -f $input_base && cmp $input_base $input >/dev/null 2>&1; then
+  input=$input_base
+fi
+
+pairlist=
+while test "$#" -ne 0; do
+   if test "$1" = "--"; then
+      shift
+      break
+   fi
+   pairlist="$pairlist $1"
+   shift
+done
+
+# FIXME: add hostname here for parallel makes that run commands on
+# other machines.  But that might take us over the 14-char limit.
+dirname=ylwrap$$
+trap "cd `pwd`; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15
+mkdir $dirname || exit 1
+
+cd $dirname
+case "$input" in
+ /*)
+    # Absolute path; do nothing.
+    ;;
+ *)
+    # Make a symbolic link, hard link or hardcopy.
+    ln -s ../"$input" . > /dev/null 2>&1 || ln ../"$input" . > /dev/null 2>&1 || cp ../"$input" .
+    ;;
+esac
+$prog ${1+"$@"} "$input"
+status=$?
+
+if test $status -eq 0; then
+   set X $pairlist
+   shift
+   first=yes
+   while test "$#" -ne 0; do
+      if test -f "$1"; then
+         # If $2 is an absolute path name, then just use that,
+         # otherwise prepend `../'.
+         case "$2" in
+          /*) target="$2";;
+          *) target="../$2";;
+        esac
+        mv "$1" "$target" || status=$?
+      else
+        # A missing file is only an error for the first file.  This
+        # is a blatant hack to let us support using "yacc -d".  If -d
+        # is not specified, we don't want an error when the header
+        # file is "missing".
+        if test $first = yes; then
+           status=1
+        fi
+      fi
+      shift
+      shift
+      first=no
+   done
+else
+   status=$?
+fi
+
+# Remove the directory.
+cd ..
+rm -rf $dirname
+
+exit $status