lac : 7c2d927f7f67970737afa04378850c0c9859688f

     1: #! /bin/sh
     2: # ylwrap - wrapper for lex/yacc invocations.
     3: 
     4: scriptversion=2013-01-12.17; # UTC
     5: 
     6: # Copyright (C) 1996-2014 Free Software Foundation, Inc.
     7: #
     8: # Written by Tom Tromey <tromey@cygnus.com>.
     9: #
    10: # This program is free software; you can redistribute it and/or modify
    11: # it under the terms of the GNU General Public License as published by
    12: # the Free Software Foundation; either version 2, or (at your option)
    13: # any later version.
    14: #
    15: # This program is distributed in the hope that it will be useful,
    16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
    17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    18: # GNU General Public License for more details.
    19: #
    20: # You should have received a copy of the GNU General Public License
    21: # along with this program.  If not, see <http://www.gnu.org/licenses/>.
    22: 
    23: # As a special exception to the GNU General Public License, if you
    24: # distribute this file as part of a program that contains a
    25: # configuration script generated by Autoconf, you may include it under
    26: # the same distribution terms that you use for the rest of that program.
    27: 
    28: # This file is maintained in Automake, please report
    29: # bugs to <bug-automake@gnu.org> or send patches to
    30: # <automake-patches@gnu.org>.
    31: 
    32: get_dirname ()
    33: {
    34:   case $1 in
    35:     */*|*\\*) printf '%s\n' "$1" | sed -e 's|\([\\/]\)[^\\/]*$|\1|';;
    36:     # Otherwise,  we want the empty string (not ".").
    37:   esac
    38: }
    39: 
    40: # guard FILE
    41: # ----------
    42: # The CPP macro used to guard inclusion of FILE.
    43: guard ()
    44: {
    45:   printf '%s\n' "$1"                                                    \
    46:     | sed                                                               \
    47:         -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'   \
    48:         -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'                        \
    49:         -e 's/__*/_/g'
    50: }
    51: 
    52: # quote_for_sed [STRING]
    53: # ----------------------
    54: # Return STRING (or stdin) quoted to be used as a sed pattern.
    55: quote_for_sed ()
    56: {
    57:   case $# in
    58:     0) cat;;
    59:     1) printf '%s\n' "$1";;
    60:   esac \
    61:     | sed -e 's|[][\\.*]|\\&|g'
    62: }
    63: 
    64: case "$1" in
    65:   '')
    66:     echo "$0: No files given.  Try '$0 --help' for more information." 1>&2
    67:     exit 1
    68:     ;;
    69:   --basedir)
    70:     basedir=$2
    71:     shift 2
    72:     ;;
    73:   -h|--h*)
    74:     cat <<\EOF
    75: Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]...
    76: 
    77: Wrapper for lex/yacc invocations, renaming files as desired.
    78: 
    79:   INPUT is the input file
    80:   OUTPUT is one file PROG generates
    81:   DESIRED is the file we actually want instead of OUTPUT
    82:   PROGRAM is program to run
    83:   ARGS are passed to PROG
    84: 
    85: Any number of OUTPUT,DESIRED pairs may be used.
    86: 
    87: Report bugs to <bug-automake@gnu.org>.
    88: EOF
    89:     exit $?
    90:     ;;
    91:   -v|--v*)
    92:     echo "ylwrap $scriptversion"
    93:     exit $?
    94:     ;;
    95: esac
    96: 
    97: 
    98: # The input.
    99: input=$1
   100: shift
   101: # We'll later need for a correct munging of "#line" directives.
   102: input_sub_rx=`get_dirname "$input" | quote_for_sed`
   103: case $input in
   104:   [\\/]* | ?:[\\/]*)
   105:     # Absolute path; do nothing.
   106:     ;;
   107:   *)
   108:     # Relative path.  Make it absolute.
   109:     input=`pwd`/$input
   110:     ;;
   111: esac
   112: input_rx=`get_dirname "$input" | quote_for_sed`
   113: 
   114: # Since DOS filename conventions don't allow two dots,
   115: # the DOS version of Bison writes out y_tab.c instead of y.tab.c
   116: # and y_tab.h instead of y.tab.h. Test to see if this is the case.
   117: y_tab_nodot=false
   118: if test -f y_tab.c || test -f y_tab.h; then
   119:   y_tab_nodot=true
   120: fi
   121: 
   122: # The parser itself, the first file, is the destination of the .y.c
   123: # rule in the Makefile.
   124: parser=$1
   125: 
   126: # A sed program to s/FROM/TO/g for all the FROM/TO so that, for
   127: # instance, we rename #include "y.tab.h" into #include "parse.h"
   128: # during the conversion from y.tab.c to parse.c.
   129: sed_fix_filenames=
   130: 
   131: # Also rename header guards, as Bison 2.7 for instance uses its header
   132: # guard in its implementation file.
   133: sed_fix_header_guards=
   134: 
   135: while test $# -ne 0; do
   136:   if test x"$1" = x"--"; then
   137:     shift
   138:     break
   139:   fi
   140:   from=$1
   141:   # Handle y_tab.c and y_tab.h output by DOS
   142:   if $y_tab_nodot; then
   143:     case $from in
   144:       "y.tab.c") from=y_tab.c;;
   145:       "y.tab.h") from=y_tab.h;;
   146:     esac
   147:   fi
   148:   shift
   149:   to=$1
   150:   shift
   151:   sed_fix_filenames="${sed_fix_filenames}s|"`quote_for_sed "$from"`"|$to|g;"
   152:   sed_fix_header_guards="${sed_fix_header_guards}s|"`guard "$from"`"|"`guard "$to"`"|g;"
   153: done
   154: 
   155: # The program to run.
   156: prog=$1
   157: shift
   158: # Make any relative path in $prog absolute.
   159: case $prog in
   160:   [\\/]* | ?:[\\/]*) ;;
   161:   *[\\/]*) prog=`pwd`/$prog ;;
   162: esac
   163: 
   164: dirname=ylwrap$$
   165: do_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret'
   166: trap "ret=129; $do_exit" 1
   167: trap "ret=130; $do_exit" 2
   168: trap "ret=141; $do_exit" 13
   169: trap "ret=143; $do_exit" 15
   170: mkdir $dirname || exit 1
   171: 
   172: cd $dirname
   173: 
   174: case $# in
   175:   0) "$prog" "$input" ;;
   176:   *) "$prog" "$@" "$input" ;;
   177: esac
   178: ret=$?
   179: 
   180: if test $ret -eq 0; then
   181:   for from in *
   182:   do
   183:     to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"`
   184:     if test -f "$from"; then
   185:       # If $2 is an absolute path name, then just use that,
   186:       # otherwise prepend '../'.
   187:       case $to in
   188:         [\\/]* | ?:[\\/]*) target=$to;;
   189:         *) target=../$to;;
   190:       esac
   191: 
   192:       # Do not overwrite unchanged header files to avoid useless
   193:       # recompilations.  Always update the parser itself: it is the
   194:       # destination of the .y.c rule in the Makefile.  Divert the
   195:       # output of all other files to a temporary file so we can
   196:       # compare them to existing versions.
   197:       if test $from != $parser; then
   198:         realtarget=$target
   199:         target=tmp-`printf '%s\n' "$target" | sed 's|.*[\\/]||g'`
   200:       fi
   201: 
   202:       # Munge "#line" or "#" directives.  Don't let the resulting
   203:       # debug information point at an absolute srcdir.  Use the real
   204:       # output file name, not yy.lex.c for instance.  Adjust the
   205:       # include guards too.
   206:       sed -e "/^#/!b"                           \
   207:           -e "s|$input_rx|$input_sub_rx|"       \
   208:           -e "$sed_fix_filenames"               \
   209:           -e "$sed_fix_header_guards"           \
   210:         "$from" >"$target" || ret=$?
   211: 
   212:       # Check whether files must be updated.
   213:       if test "$from" != "$parser"; then
   214:         if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then
   215:           echo "$to is unchanged"
   216:           rm -f "$target"
   217:         else
   218:           echo "updating $to"
   219:           mv -f "$target" "$realtarget"
   220:         fi
   221:       fi
   222:     else
   223:       # A missing file is only an error for the parser.  This is a
   224:       # blatant hack to let us support using "yacc -d".  If -d is not
   225:       # specified, don't fail when the header file is "missing".
   226:       if test "$from" = "$parser"; then
   227:         ret=1
   228:       fi
   229:     fi
   230:   done
   231: fi
   232: 
   233: # Remove the directory.
   234: cd ..
   235: rm -rf $dirname
   236: 
   237: exit $ret
   238: 
   239: # Local Variables:
   240: # mode: shell-script
   241: # sh-indentation: 2
   242: # eval: (add-hook 'write-file-hooks 'time-stamp)
   243: # time-stamp-start: "scriptversion="
   244: # time-stamp-format: "%:y-%02m-%02d.%02H"
   245: # time-stamp-time-zone: "UTC"
   246: # time-stamp-end: "; # UTC"
   247: # End:

Generated by git2html.