(linenum→info "unix/slp.c:2238")

coreutils/6.9/build-aux/ylwrap

    1: #! /bin/sh
    2: # ylwrap - wrapper for lex/yacc invocations.
    3: 
    4: scriptversion=2005-05-14.22
    5: 
    6: # Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005
    7: #   Free Software Foundation, Inc.
    8: #
    9: # Written by Tom Tromey <tromey@cygnus.com>.
   10: #
   11: # This program is free software; you can redistribute it and/or modify
   12: # it under the terms of the GNU General Public License as published by
   13: # the Free Software Foundation; either version 2, or (at your option)
   14: # any later version.
   15: #
   16: # This program is distributed in the hope that it will be useful,
   17: # but WITHOUT ANY WARRANTY; without even the implied warranty of
   18: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   19: # GNU General Public License for more details.
   20: #
   21: # You should have received a copy of the GNU General Public License
   22: # along with this program; if not, write to the Free Software
   23: # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
   24: # 02110-1301, USA.
   25: 
   26: # As a special exception to the GNU General Public License, if you
   27: # distribute this file as part of a program that contains a
   28: # configuration script generated by Autoconf, you may include it under
   29: # the same distribution terms that you use for the rest of that program.
   30: 
   31: # This file is maintained in Automake, please report
   32: # bugs to <bug-automake@gnu.org> or send patches to
   33: # <automake-patches@gnu.org>.
   34: 
   35: case "$1" in
   36:   '')
   37:     echo "$0: No files given.  Try \`$0 --help' for more information." 1>&2
   38:     exit 1
   39:     ;;
   40:   --basedir)
   41:     basedir=$2
   42:     shift 2
   43:     ;;
   44:   -h|--h*)
   45:     cat <<\EOF
   46: Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]...
   47: 
   48: Wrapper for lex/yacc invocations, renaming files as desired.
   49: 
   50:   INPUT is the input file
   51:   OUTPUT is one file PROG generates
   52:   DESIRED is the file we actually want instead of OUTPUT
   53:   PROGRAM is program to run
   54:   ARGS are passed to PROG
   55: 
   56: Any number of OUTPUT,DESIRED pairs may be used.
   57: 
   58: Report bugs to <bug-automake@gnu.org>.
   59: EOF
   60:     exit $?
   61:     ;;
   62:   -v|--v*)
   63:     echo "ylwrap $scriptversion"
   64:     exit $?
   65:     ;;
   66: esac
   67: 
   68: 
   69: # The input.
   70: input="$1"
   71: shift
   72: case "$input" in
   73:   [\\/]* | ?:[\\/]*)
   74:     # Absolute path; do nothing.
   75:     ;;
   76:   *)
   77:     # Relative path.  Make it absolute.
   78:     input="`pwd`/$input"
   79:     ;;
   80: esac
   81: 
   82: pairlist=
   83: while test "$#" -ne 0; do
   84:   if test "$1" = "--"; then
   85:     shift
   86:     break
   87:   fi
   88:   pairlist="$pairlist $1"
   89:   shift
   90: done
   91: 
   92: # The program to run.
   93: prog="$1"
   94: shift
   95: # Make any relative path in $prog absolute.
   96: case "$prog" in
   97:   [\\/]* | ?:[\\/]*) ;;
   98:   *[\\/]*) prog="`pwd`/$prog" ;;
   99: esac
  100: 
  101: # FIXME: add hostname here for parallel makes that run commands on
  102: # other machines.  But that might take us over the 14-char limit.
  103: dirname=ylwrap$$
  104: trap "cd `pwd`; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15
  105: mkdir $dirname || exit 1
  106: 
  107: cd $dirname
  108: 
  109: case $# in
  110:   0) $prog "$input" ;;
  111:   *) $prog "$@" "$input" ;;
  112: esac
  113: ret=$?
  114: 
  115: if test $ret -eq 0; then
  116:   set X $pairlist
  117:   shift
  118:   first=yes
  119:   # Since DOS filename conventions don't allow two dots,
  120:   # the DOS version of Bison writes out y_tab.c instead of y.tab.c
  121:   # and y_tab.h instead of y.tab.h. Test to see if this is the case.
  122:   y_tab_nodot="no"
  123:   if test -f y_tab.c || test -f y_tab.h; then
  124:     y_tab_nodot="yes"
  125:   fi
  126: 
  127:   # The directory holding the input.
  128:   input_dir=`echo "$input" | sed -e 's,\([\\/]\)[^\\/]*$,\1,'`
  129:   # Quote $INPUT_DIR so we can use it in a regexp.
  130:   # FIXME: really we should care about more than `.' and `\'.
  131:   input_rx=`echo "$input_dir" | sed 's,\\\\,\\\\\\\\,g;s,\\.,\\\\.,g'`
  132: 
  133:   while test "$#" -ne 0; do
  134:     from="$1"
  135:     # Handle y_tab.c and y_tab.h output by DOS
  136:     if test $y_tab_nodot = "yes"; then
  137:       if test $from = "y.tab.c"; then
  138:         from="y_tab.c"
  139:       else
  140:         if test $from = "y.tab.h"; then
  141:           from="y_tab.h"
  142:         fi
  143:       fi
  144:     fi
  145:     if test -f "$from"; then
  146:       # If $2 is an absolute path name, then just use that,
  147:       # otherwise prepend `../'.
  148:       case "$2" in
  149:         [\\/]* | ?:[\\/]*) target="$2";;
  150:         *) target="../$2";;
  151:       esac
  152: 
  153:       # We do not want to overwrite a header file if it hasn't
  154:       # changed.  This avoid useless recompilations.  However the
  155:       # parser itself (the first file) should always be updated,
  156:       # because it is the destination of the .y.c rule in the
  157:       # Makefile.  Divert the output of all other files to a temporary
  158:       # file so we can compare them to existing versions.
  159:       if test $first = no; then
  160:         realtarget="$target"
  161:         target="tmp-`echo $target | sed s/.*[\\/]//g`"
  162:       fi
  163:       # Edit out `#line' or `#' directives.
  164:       #
  165:       # We don't want the resulting debug information to point at
  166:       # an absolute srcdir; it is better for it to just mention the
  167:       # .y file with no path.
  168:       #
  169:       # We want to use the real output file name, not yy.lex.c for
  170:       # instance.
  171:       #
  172:       # We want the include guards to be adjusted too.
  173:       FROM=`echo "$from" | sed \
  174:             -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
  175:             -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
  176:       TARGET=`echo "$2" | sed \
  177:             -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
  178:             -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
  179: 
  180:       sed -e "/^#/!b" -e "s,$input_rx,," -e "s,$from,$2," \
  181:           -e "s,$FROM,$TARGET," "$from" >"$target" || ret=$?
  182: 
  183:       # Check whether header files must be updated.
  184:       if test $first = no; then
  185:         if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then
  186:           echo "$2" is unchanged
  187:           rm -f "$target"
  188:         else
  189:           echo updating "$2"
  190:           mv -f "$target" "$realtarget"
  191:         fi
  192:       fi
  193:     else
  194:       # A missing file is only an error for the first file.  This
  195:       # is a blatant hack to let us support using "yacc -d".  If -d
  196:       # is not specified, we don't want an error when the header
  197:       # file is "missing".
  198:       if test $first = yes; then
  199:         ret=1
  200:       fi
  201:     fi
  202:     shift
  203:     shift
  204:     first=no
  205:   done
  206: else
  207:   ret=$?
  208: fi
  209: 
  210: # Remove the directory.
  211: cd ..
  212: rm -rf $dirname
  213: 
  214: exit $ret
  215: 
  216: # Local Variables:
  217: # mode: shell-script
  218: # sh-indentation: 2
  219: # eval: (add-hook 'write-file-hooks 'time-stamp)
  220: # time-stamp-start: "scriptversion="
  221: # time-stamp-format: "%:y-%02m-%02d.%02H"
  222: # time-stamp-end: "$"
  223: # End:
Syntax (Markdown)