These files are being moved from the contrib/fixinc directory.
They have been modified somewhat to work in the new environment. From-SVN: r23125
This commit is contained in:
parent
162bc98d09
commit
0083c9044f
132
gcc/fixinc/Makefile.in
Normal file
132
gcc/fixinc/Makefile.in
Normal file
@ -0,0 +1,132 @@
|
||||
# Makefile for GNU C++ compiler.
|
||||
# Copyright (C) 1987, 88, 90-5, 1998 Free Software Foundation, Inc.
|
||||
|
||||
#This file is part of GNU CC.
|
||||
|
||||
#GNU CC 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.
|
||||
|
||||
#GNU CC 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 GNU CC; see the file COPYING. If not, write to
|
||||
#the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
#Boston, MA 02111-1307, USA.
|
||||
|
||||
# The makefile built from this file lives in the fixinc subdirectory.
|
||||
# Its purpose is to build the any-platforms fixinc.sh script.
|
||||
|
||||
CFLAGS = -g
|
||||
|
||||
CC = @CC@
|
||||
SHELL = /bin/sh
|
||||
|
||||
target=@target@
|
||||
# Directory where sources are, from where we are.
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
# End of variables for you to override.
|
||||
|
||||
default : gen
|
||||
|
||||
# Now figure out from those variables how to compile and link.
|
||||
|
||||
# Specify the directories to be searched for header files.
|
||||
# Both . and srcdir are used, in that order.
|
||||
INCLUDES = -I. -I.. -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../config
|
||||
|
||||
# Always use -I$(srcdir)/config when compiling.
|
||||
.c.o:
|
||||
$(CC) -c $(CFLAGS) $(CPPFLAGS) $(INCLUDES) $<
|
||||
|
||||
# The only suffixes we want for implicit rules are .c and .o.
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .c .o
|
||||
|
||||
#
|
||||
|
||||
## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||
##
|
||||
## Makefile for constructing the "best" include fixer we can
|
||||
##
|
||||
## $Id: Makefile.in,v 1.2 1998/12/16 21:18:54 law Exp $
|
||||
##
|
||||
## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||
|
||||
OBJ = fixincl.o server.o regex.o
|
||||
HDR = server.h regex.h
|
||||
|
||||
SH_TARGET = inclhack.sh fixincl.sh
|
||||
BIN_TARGET = fixincl
|
||||
AG_TEXT = $(SH_TARGET) fixincl.x \
|
||||
inclhack.def inclhack.tpl hackshell.tpl fixincl.tpl
|
||||
TARGETS = $(SH_TARGET) $(BIN_TARGET)
|
||||
|
||||
all : $(TARGETS)
|
||||
sh : $(SH_TARGET)
|
||||
gen : $(SH_TARGET) fixincl.x
|
||||
|
||||
$(OBJ): $(HDR)
|
||||
|
||||
fixincl: $(OBJ)
|
||||
@echo $(CC) -o $@ $(OBJ) $(LIB) ; \
|
||||
if $(CC) -o $@ $(OBJ) $(LIB) ; then : ; else \
|
||||
rm -f $@ ; (echo "#! /bin/sh" ; echo exit 1 ) > $@ ; \
|
||||
chmod 777 $@ ; fi
|
||||
|
||||
regex.o: regex.c
|
||||
-$(CC) $(CFLAGS) -DSTDC_HEADERS=1 -c regex.c
|
||||
|
||||
fixincl.o : fixincl.x fixincl.c
|
||||
server.o : server.c server.h
|
||||
|
||||
fixincl.x: fixincl.tpl inclhack.def
|
||||
@if ( autogen --help > /dev/null 2>&1 ) ; then \
|
||||
echo autogen -T fixincl.tpl -b fixincl inclhack.def ; \
|
||||
autogen -T $(srcdir)/fixincl.tpl -b fixincl \
|
||||
$(srcdir)/inclhack.def ; \
|
||||
else echo You need to install autogen ; \
|
||||
$(CP) $(srcdir)/$@ . ; fi
|
||||
|
||||
inclhack.sh: inclhack.def inclhack.tpl hackshell.tpl
|
||||
@if ( autogen --help > /dev/null 2>&1 ) ; then \
|
||||
echo autogen inclhack.def ; \
|
||||
autogen inclhack.def ; \
|
||||
else echo You need to install autogen ; \
|
||||
$(CP) $(srcdir)/$@ . ; fi
|
||||
|
||||
fixincl.sh: inclhack.def inclhack.tpl
|
||||
@if ( autogen --help > /dev/null 2>&1 ) ; then \
|
||||
echo autogen -DPROGRAM=1 -b fixincl inclhack.def ; \
|
||||
autogen -DPROGRAM=1 -b fixincl inclhack.def ; touch $@ ; \
|
||||
else echo You need to install autogen ; \
|
||||
$(CP) $(srcdir)/$@ . ; fi
|
||||
|
||||
clean:
|
||||
rm -f *.o $(TARGETS) fixincl.x
|
||||
|
||||
# Ensure all the targets are built. If the program "fixincl"
|
||||
# failed to compile, link or load, then we install the
|
||||
# "inclhack.sh" script. Otherwise, we install that program
|
||||
# plus the wrapper script, "fixincl.sh".
|
||||
#
|
||||
install: $(TARGETS)
|
||||
@rm -f ../fixinc.sh ; \
|
||||
if ( ./fixincl -v > /dev/null 2>&1 ) ; then \
|
||||
echo cp fixincl.sh ../fixinc.sh ; \
|
||||
cp fixincl.sh ../fixinc.sh ; \
|
||||
chmod 555 ../fixinc.sh ; \
|
||||
rm -f ../fixincl ; \
|
||||
echo cp fixincl .. ; \
|
||||
cp fixincl .. ; \
|
||||
chmod 555 ../fixincl ; \
|
||||
else \
|
||||
echo cp inclhack.sh ../fixinc.sh ; \
|
||||
cp inclhack.sh ../fixinc.sh ; \
|
||||
fi
|
185
gcc/fixinc/fixinc.dgux
Executable file
185
gcc/fixinc/fixinc.dgux
Executable file
@ -0,0 +1,185 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# modified for dgux by hassey@dg-rtp.dg.com based on
|
||||
#
|
||||
# fixinc.svr4 written by Ron Guilmette (rfg@ncd.com).
|
||||
#
|
||||
# This file is part of GNU CC.
|
||||
#
|
||||
# GNU CC 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.
|
||||
#
|
||||
# GNU CC 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 GNU CC; see the file COPYING. If not, write to
|
||||
# the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
# Boston, MA 02111-1307, USA.
|
||||
#
|
||||
#
|
||||
# See README-fixinc for more information.
|
||||
|
||||
# Directory containing the original header files.
|
||||
INPUT=${2-${INPUT-/usr/include}}
|
||||
|
||||
# Fail if no arg to specify a directory for the output.
|
||||
if [ x$1 = x ]
|
||||
then echo fixincludes: no output directory specified
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Directory in which to store the results.
|
||||
LIB=${1?"fixincludes: output directory not specified"}
|
||||
|
||||
# Make sure it exists.
|
||||
if [ ! -d $LIB ]; then
|
||||
mkdir $LIB || exit 1
|
||||
fi
|
||||
|
||||
ORIG_DIR=`pwd`
|
||||
|
||||
# Make LIB absolute if it is relative.
|
||||
# Don't do this if not necessary, since may screw up automounters.
|
||||
case $LIB in
|
||||
/*)
|
||||
;;
|
||||
*)
|
||||
cd $LIB; LIB=`${PWDCMD-pwd}`
|
||||
;;
|
||||
esac
|
||||
|
||||
echo 'Building fixincludes in ' ${LIB}
|
||||
|
||||
# Determine whether this filesystem has symbolic links.
|
||||
if ln -s X $LIB/ShouldNotExist 2>/dev/null; then
|
||||
rm -f $LIB/ShouldNotExist
|
||||
LINKS=true
|
||||
else
|
||||
LINKS=false
|
||||
fi
|
||||
|
||||
echo 'Making directories:'
|
||||
cd ${INPUT}
|
||||
if $LINKS; then
|
||||
files=`ls -LR | sed -n s/:$//p`
|
||||
else
|
||||
files=`find . -type d -print | sed '/^.$/d'`
|
||||
fi
|
||||
for file in $files; do
|
||||
rm -rf $LIB/$file
|
||||
if [ ! -d $LIB/$file ]
|
||||
then mkdir $LIB/$file
|
||||
fi
|
||||
done
|
||||
|
||||
# treetops gets an alternating list
|
||||
# of old directories to copy
|
||||
# and the new directories to copy to.
|
||||
treetops="${INPUT} ${LIB}"
|
||||
|
||||
if $LINKS; then
|
||||
echo 'Making internal symbolic directory links'
|
||||
for file in $files; do
|
||||
dest=`ls -ld $file | sed -n 's/.*-> //p'`
|
||||
if [ "$dest" ]; then
|
||||
cwd=`pwd`
|
||||
# In case $dest is relative, get to $file's dir first.
|
||||
cd ${INPUT}
|
||||
cd `echo ./$file | sed -n 's&[^/]*$&&p'`
|
||||
# Check that the target directory exists.
|
||||
# Redirections changed to avoid bug in sh on Ultrix.
|
||||
(cd $dest) > /dev/null 2>&1
|
||||
if [ $? = 0 ]; then
|
||||
cd $dest
|
||||
# X gets the dir that the link actually leads to.
|
||||
x=`pwd`
|
||||
# If link leads back into ${INPUT},
|
||||
# make a similar link here.
|
||||
if expr $x : "${INPUT}/.*" > /dev/null; then
|
||||
# Y gets the actual target dir name, relative to ${INPUT}.
|
||||
y=`echo $x | sed -n "s&${INPUT}/&&p"`
|
||||
# DOTS is the relative path from ${LIB}/$file's dir back to ${LIB}.
|
||||
dots=`echo "$file" |
|
||||
sed -e 's@^./@@' -e 's@/./@/@g' -e 's@[^/][^/]*@..@g' -e 's@..$@@'`
|
||||
echo $file '->' $dots$y ': Making link'
|
||||
rm -fr ${LIB}/$file > /dev/null 2>&1
|
||||
ln -s $dots$y ${LIB}/$file > /dev/null 2>&1
|
||||
else
|
||||
# If the link is to outside ${INPUT},
|
||||
# treat this directory as if it actually contained the files.
|
||||
# This line used to have $dest instead of $x.
|
||||
# $dest seemed to be wrong for links found in subdirectories
|
||||
# of ${INPUT}. Does this change break anything?
|
||||
treetops="$treetops $x ${LIB}/$file"
|
||||
fi
|
||||
fi
|
||||
cd $cwd
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Completely replace <_int_varargs.h> with a file that defines
|
||||
# va_list and gnuc_va_list
|
||||
|
||||
file=_int_varargs.h
|
||||
if [ -r ${INPUT}/$file ]; then
|
||||
echo Replacing $file
|
||||
cat > ${LIB}/$file << EOF
|
||||
/* This file was generated by fixinc.dgux. */
|
||||
#ifndef __INT_VARARGS_H
|
||||
#define __INT_VARARGS_H
|
||||
|
||||
#if defined(__m88k__) && defined (__DGUX__)
|
||||
#ifndef __GNUC_VA_LIST
|
||||
#define __GNUC_VA_LIST
|
||||
typedef struct
|
||||
{
|
||||
int __va_arg; /* argument number */
|
||||
int *__va_stk; /* start of args passed on stack */
|
||||
int *__va_reg; /* start of args passed in regs */
|
||||
} __gnuc_va_list;
|
||||
#endif /* not __GNUC_VA_LIST */
|
||||
#endif /* 88k && dgux */
|
||||
|
||||
#ifndef _VA_LIST_
|
||||
#define _VA_LIST_
|
||||
typedef __gnuc_va_list va_list;
|
||||
#endif /* _VA_LIST_ */
|
||||
|
||||
#endif /* __INT_VARARGS_H */
|
||||
|
||||
EOF
|
||||
chmod a+r ${LIB}/$file
|
||||
fi
|
||||
|
||||
echo 'Removing unneeded directories:'
|
||||
cd $LIB
|
||||
files=`find . -type d -print | sort -r`
|
||||
for file in $files; do
|
||||
rmdir $LIB/$file > /dev/null 2>&1
|
||||
done
|
||||
|
||||
if $LINKS; then
|
||||
echo 'Making internal symbolic non-directory links'
|
||||
cd ${INPUT}
|
||||
files=`find . -type l -print`
|
||||
for file in $files; do
|
||||
dest=`ls -ld $file | sed -n 's/.*-> //p'`
|
||||
if expr "$dest" : '[^/].*' > /dev/null; then
|
||||
target=${LIB}/`echo file | sed "s|[^/]*\$|$dest|"`
|
||||
if [ -f $target ]; then
|
||||
ln -s $dest ${LIB}/$file >/dev/null 2>&1
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
cd ${ORIG_DIR}
|
||||
|
||||
exit 0
|
||||
|
225
gcc/fixinc/fixinc.irix
Executable file
225
gcc/fixinc/fixinc.irix
Executable file
@ -0,0 +1,225 @@
|
||||
#! /bin/sh
|
||||
# Install modified versions of certain problematic Irix include files.
|
||||
# If possible, create a wrapper (see fixinc.wrap) instead of copying files.
|
||||
#
|
||||
# Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
# Contributed by Brendan Kehoe (brendan@cygnus.com).
|
||||
#
|
||||
# This file is part of GNU CC.
|
||||
#
|
||||
# GNU CC 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.
|
||||
#
|
||||
# GNU CC 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 GNU CC; see the file COPYING. If not, write to
|
||||
# the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
# Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# See README-fixinc for more information.
|
||||
|
||||
# Directory containing the original header files.
|
||||
INPUT=${2-${INPUT-/usr/include}}
|
||||
|
||||
# Fail if no arg to specify a directory for the output.
|
||||
if [ x$1 = x ]
|
||||
then echo fixincludes: no output directory specified
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Directory in which to store the results.
|
||||
LIB=${1?"fixincludes: output directory not specified"}
|
||||
|
||||
# Make sure it exists.
|
||||
if [ ! -d $LIB ]; then
|
||||
mkdir $LIB || exit 1
|
||||
fi
|
||||
|
||||
ORIG_DIR=`pwd`
|
||||
|
||||
# Make LIB absolute if it is relative.
|
||||
# Don't do this if not necessary, since may screw up automounters.
|
||||
case $LIB in
|
||||
/*)
|
||||
;;
|
||||
*)
|
||||
LIB=$ORIG_DIR/$LIB
|
||||
;;
|
||||
esac
|
||||
|
||||
echo 'Building fixincludes in ' ${LIB}
|
||||
|
||||
#
|
||||
# Note: For Irix, we deliberately don't try to create the directory trees,
|
||||
# since we only modify math.h, limits.h and unistd.h. If we
|
||||
# ADD ANY OTHERS, the "Making directories:" and symlinks code from
|
||||
# fixinc.svr4 may have to go back in.
|
||||
|
||||
# This math.h fix is copied from fixinc.wrap. We want to avoid copying
|
||||
# math.h because both math.h and stdlib.h have a declaration for initstate,
|
||||
# and this declaration changed between Irix 6.2 and Irix 6.3. If we copy this
|
||||
# file, then the same toolchain can't be shared between 6.2 and 6.3+.
|
||||
|
||||
# Some math.h files define struct exception, which conflicts with
|
||||
# the class exception defined in the C++ file std/stdexcept.h. We
|
||||
# redefine it to __math_exception. This is not a great fix, but I
|
||||
# haven't been able to think of anything better.
|
||||
file=math.h
|
||||
if [ -r $INPUT/$file ]; then
|
||||
echo Checking $INPUT/$file
|
||||
if grep 'struct exception' $INPUT/$file >/dev/null
|
||||
then
|
||||
echo Fixed $file
|
||||
rm -f $LIB/$file
|
||||
cat <<'__EOF__' >$LIB/$file
|
||||
#ifndef _MATH_H_WRAPPER
|
||||
#ifdef __cplusplus
|
||||
# define exception __math_exception
|
||||
#endif
|
||||
#include_next <math.h>
|
||||
#ifdef __cplusplus
|
||||
# undef exception
|
||||
#endif
|
||||
#define _MATH_H_WRAPPER
|
||||
#endif /* _MATH_H_WRAPPER */
|
||||
__EOF__
|
||||
# Define _MATH_H_WRAPPER at the end of the wrapper, not the start,
|
||||
# so that if #include_next gets another instance of the wrapper,
|
||||
# this will follow the #include_next chain until we arrive at
|
||||
# the real <math.h>.
|
||||
chmod a+r $LIB/$file
|
||||
fi
|
||||
fi
|
||||
|
||||
# Avoid the definition of the bool type in curses.h when using
|
||||
# g++, since it's now an official type in the C++ language.
|
||||
|
||||
# This is also from fixinc.wrap.
|
||||
|
||||
file=curses.h
|
||||
if [ -r $INPUT/$file ]; then
|
||||
echo Checking $INPUT/$file
|
||||
w='[ ]'
|
||||
if grep "typedef$w$w*char$w$w*bool$w*;" $INPUT/$file >/dev/null
|
||||
then
|
||||
echo Fixed $file
|
||||
rm -f $LIB/$file
|
||||
cat <<'__EOF__' >$LIB/$file
|
||||
#ifndef _CURSES_H_WRAPPER
|
||||
#ifdef __cplusplus
|
||||
# define bool __curses_bool_t
|
||||
#endif
|
||||
#include_next <curses.h>
|
||||
#ifdef __cplusplus
|
||||
# undef bool
|
||||
#endif
|
||||
#define _CURSES_H_WRAPPER
|
||||
#endif /* _CURSES_H_WRAPPER */
|
||||
__EOF__
|
||||
# Define _CURSES_H_WRAPPER at the end of the wrapper, not the start,
|
||||
# so that if #include_next gets another instance of the wrapper,
|
||||
# this will follow the #include_next chain until we arrive at
|
||||
# the real <curses.h>.
|
||||
chmod a+r $LIB/$file
|
||||
fi
|
||||
fi
|
||||
|
||||
# In limits.h, put #ifndefs around things that are supposed to be defined
|
||||
# in float.h to avoid redefinition errors if float.h is included first.
|
||||
|
||||
file=limits.h
|
||||
base=`basename $file`
|
||||
if [ -r ${LIB}/$file ]; then
|
||||
file_to_fix=${LIB}/$file
|
||||
else
|
||||
if [ -r ${INPUT}/$file ]; then
|
||||
file_to_fix=${INPUT}/$file
|
||||
else
|
||||
file_to_fix=""
|
||||
fi
|
||||
fi
|
||||
if [ \! -z "$file_to_fix" ]; then
|
||||
echo Checking $file_to_fix
|
||||
sed -e '/[ ]FLT_MIN[ ]/i\
|
||||
#ifndef FLT_MIN
|
||||
'\
|
||||
-e '/[ ]FLT_MIN[ ]/a\
|
||||
#endif
|
||||
'\
|
||||
-e '/[ ]FLT_MAX[ ]/i\
|
||||
#ifndef FLT_MAX
|
||||
'\
|
||||
-e '/[ ]FLT_MAX[ ]/a\
|
||||
#endif
|
||||
'\
|
||||
-e '/[ ]FLT_DIG[ ]/i\
|
||||
#ifndef FLT_DIG
|
||||
'\
|
||||
-e '/[ ]FLT_DIG[ ]/a\
|
||||
#endif
|
||||
'\
|
||||
-e '/[ ]DBL_MIN[ ]/i\
|
||||
#ifndef DBL_MIN
|
||||
'\
|
||||
-e '/[ ]DBL_MIN[ ]/a\
|
||||
#endif
|
||||
'\
|
||||
-e '/[ ]DBL_MAX[ ]/i\
|
||||
#ifndef DBL_MAX
|
||||
'\
|
||||
-e '/[ ]DBL_MAX[ ]/a\
|
||||
#endif
|
||||
'\
|
||||
-e '/[ ]DBL_DIG[ ]/i\
|
||||
#ifndef DBL_DIG
|
||||
'\
|
||||
-e '/[ ]DBL_DIG[ ]/a\
|
||||
#endif
|
||||
' $file_to_fix > /tmp/$base
|
||||
if cmp $file_to_fix /tmp/$base >/dev/null 2>&1; then \
|
||||
true
|
||||
else
|
||||
echo Fixed $file_to_fix
|
||||
rm -f ${LIB}/$file
|
||||
cp /tmp/$base ${LIB}/$file
|
||||
chmod a+r ${LIB}/$file
|
||||
fi
|
||||
rm -f /tmp/$base
|
||||
fi
|
||||
|
||||
# The Irix unistd.h will introduce a call to __vfork in its libc, but the
|
||||
# function is never actually prototyped.
|
||||
file=unistd.h
|
||||
base=`basename $file`
|
||||
if [ -r ${LIB}/$file ]; then
|
||||
file_to_fix=${LIB}/$file
|
||||
else
|
||||
if [ -r ${INPUT}/$file ]; then
|
||||
file_to_fix=${INPUT}/$file
|
||||
else
|
||||
file_to_fix=""
|
||||
fi
|
||||
fi
|
||||
if [ \! -z "$file_to_fix" ]; then
|
||||
echo Checking $file_to_fix
|
||||
sed -e '/__vfork/i\
|
||||
extern pid_t __vfork(void);'\
|
||||
$file_to_fix > /tmp/$base
|
||||
if cmp $file_to_fix /tmp/$base >/dev/null 2>&1; then \
|
||||
true
|
||||
else
|
||||
echo Fixed $file_to_fix
|
||||
rm -f ${LIB}/$file
|
||||
cp /tmp/$base ${LIB}/$file
|
||||
chmod a+r ${LIB}/$file
|
||||
fi
|
||||
rm -f /tmp/$base
|
||||
fi
|
||||
|
||||
exit 0
|
257
gcc/fixinc/fixinc.ptx
Normal file
257
gcc/fixinc/fixinc.ptx
Normal file
@ -0,0 +1,257 @@
|
||||
#! /bin/sh
|
||||
# Install modified versions of certain ANSI-incompatible
|
||||
# native Sequent DYNIX/ptx System V Release 3.2 system include files.
|
||||
# Copyright (C) 1994, 1996, 1997 Free Software Foundation, Inc.
|
||||
# Contributed by Bill Burton <billb@progress.com>
|
||||
# Portions adapted from fixinc.svr4 and fixincludes.
|
||||
#
|
||||
# This file is part of GNU CC.
|
||||
#
|
||||
# GNU CC 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.
|
||||
#
|
||||
# GNU CC 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 GNU CC; see the file COPYING. If not, write to
|
||||
# the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
# Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# This script munges the native include files provided with DYNIX/ptx
|
||||
# so as to remove things which are violations of the ANSI C standard.
|
||||
# This is done by first running fixinc.svr4 which does most of the
|
||||
# work. A few includes have fixes made to them afterwards by this
|
||||
# script. Once munged, the resulting new system include files are
|
||||
# placed in a directory that GNU C will search *before* searching the
|
||||
# /usr/include directory. This script should work properly for most
|
||||
# DYNIX/ptx systems. For other types of systems, you should use the
|
||||
# `fixincludes' script instead.
|
||||
#
|
||||
# See README-fixinc for more information.
|
||||
|
||||
# Directory containing the original header files.
|
||||
INPUT=${2-${INPUT-/usr/include}}
|
||||
|
||||
# Fail if no arg to specify a directory for the output.
|
||||
if [ x$1 = x ]
|
||||
then echo fixincludes: no output directory specified
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Directory in which to store the results.
|
||||
LIB=${1?"fixincludes: output directory not specified"}
|
||||
|
||||
# Make sure it exists.
|
||||
if [ ! -d $LIB ]; then
|
||||
mkdir $LIB || exit 1
|
||||
fi
|
||||
|
||||
ORIG_DIR=`pwd`
|
||||
|
||||
# Make LIB absolute if it is relative.
|
||||
# Don't do this if not necessary, since may screw up automounters.
|
||||
case $LIB in
|
||||
/*)
|
||||
;;
|
||||
*)
|
||||
LIB=$ORIG_DIR/$LIB
|
||||
;;
|
||||
esac
|
||||
|
||||
echo 'Running fixinc.svr4'
|
||||
# DYNIX/ptx has dirname so this is no problem
|
||||
`dirname $0`/fixinc.svr4 $*
|
||||
echo 'Finished fixinc.svr4'
|
||||
|
||||
echo 'Building fixincludes in ' ${LIB}
|
||||
|
||||
# Copied from fixincludes.
|
||||
# Don't use or define the name va_list in stdio.h.
|
||||
# This is for ANSI and also to interoperate properly with gcc's varargs.h.
|
||||
file=stdio.h
|
||||
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
|
||||
cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
|
||||
chmod +w ${LIB}/$file 2>/dev/null
|
||||
chmod a+r ${LIB}/$file 2>/dev/null
|
||||
fi
|
||||
|
||||
if [ -r ${LIB}/$file ]; then
|
||||
echo Fixing $file, use of va_list
|
||||
# Arrange for stdio.h to use stdarg.h to define __gnuc_va_list
|
||||
(echo "#define __need___va_list"
|
||||
echo "#include <stdarg.h>") > ${LIB}/${file}.sed
|
||||
# Use __gnuc_va_list in arg types in place of va_list.
|
||||
# On 386BSD use __gnuc_va_list instead of _VA_LIST_. We're hoping the
|
||||
# trailing parentheses and semicolon save all other systems from this.
|
||||
# Define __va_list__ (something harmless and unused) instead of va_list.
|
||||
# Don't claim to have defined va_list.
|
||||
sed -e 's@ va_list @ __gnuc_va_list @' \
|
||||
-e 's@ va_list)@ __gnuc_va_list)@' \
|
||||
-e 's@ _VA_LIST_));@ __gnuc_va_list));@' \
|
||||
-e 's@ va_list@ __va_list__@' \
|
||||
-e 's@\*va_list@*__va_list__@' \
|
||||
-e 's@ __va_list)@ __gnuc_va_list)@' \
|
||||
-e 's@_NEED___VA_LIST@_NEED___Va_LIST@' \
|
||||
-e 's@VA_LIST@DUMMY_VA_LIST@' \
|
||||
-e 's@_NEED___Va_LIST@_NEED___VA_LIST@' \
|
||||
${LIB}/$file >> ${LIB}/${file}.sed
|
||||
|
||||
rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
|
||||
if cmp $file ${LIB}/$file >/dev/null 2>&1; then
|
||||
rm -f ${LIB}/$file
|
||||
fi
|
||||
fi
|
||||
|
||||
# In pwd.h, PTX 1.x needs stdio.h included since FILE * was added in a
|
||||
# prototype later on in the file.
|
||||
file=pwd.h
|
||||
base=`basename $file`
|
||||
if [ -r ${LIB}/$file ]; then
|
||||
file_to_fix=${LIB}/$file
|
||||
else
|
||||
if [ -r ${INPUT}/$file ]; then
|
||||
file_to_fix=${INPUT}/$file
|
||||
else
|
||||
file_to_fix=""
|
||||
fi
|
||||
fi
|
||||
if [ \! -z "$file_to_fix" ]; then
|
||||
echo Checking $file_to_fix
|
||||
if grep stdio $file_to_fix > /dev/null; then
|
||||
true
|
||||
else
|
||||
sed -e '/#include <sys\/types\.h>/a\
|
||||
\
|
||||
#if defined(__STDC__) || defined(__cplusplus)\
|
||||
#include <stdio.h>\
|
||||
#endif /* __STDC__ */
|
||||
' \
|
||||
$file_to_fix > ${LIB}/${file}.sed
|
||||
rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
|
||||
echo Fixed $file_to_fix
|
||||
fi
|
||||
fi
|
||||
|
||||
# Copied from fixincludes.
|
||||
# math.h puts the declaration of matherr before the definition
|
||||
# of struct exception, so the prototype (added by fixproto) causes havoc.
|
||||
file=math.h
|
||||
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
|
||||
cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
|
||||
chmod +w ${LIB}/$file 2>/dev/null
|
||||
chmod a+r ${LIB}/$file 2>/dev/null
|
||||
fi
|
||||
|
||||
if [ -r ${LIB}/$file ]; then
|
||||
echo Fixing $file, matherr declaration
|
||||
sed -e '/^struct exception/,$b' \
|
||||
-e '/matherr/i\
|
||||
struct exception;
|
||||
'\
|
||||
${LIB}/$file > ${LIB}/${file}.sed
|
||||
rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
|
||||
if cmp $file ${LIB}/$file >/dev/null 2>&1; then
|
||||
rm -f ${LIB}/$file
|
||||
fi
|
||||
fi
|
||||
|
||||
# In netinet/in.h, the network byte swapping asm functions supported by the
|
||||
# native cc compiler on PTX 1.x and 2.x is not supported in gcc. Instead,
|
||||
# include <sys/byteorder.h> written out by the fixinc.svr4 script which has
|
||||
# these same routines written in an asm format supported by gcc.
|
||||
file=netinet/in.h
|
||||
base=`basename $file`
|
||||
if [ -r ${LIB}/$file ]; then
|
||||
file_to_fix=${LIB}/$file
|
||||
else
|
||||
if [ -r ${INPUT}/$file ]; then
|
||||
file_to_fix=${INPUT}/$file
|
||||
else
|
||||
file_to_fix=""
|
||||
fi
|
||||
fi
|
||||
if [ \! -z "$file_to_fix" ]; then
|
||||
echo Checking $file_to_fix
|
||||
if grep __GNUC__ $file_to_fix > /dev/null; then
|
||||
true
|
||||
else
|
||||
sed -e '/#define NETSWAP/a\
|
||||
\
|
||||
#if defined (__GNUC__) || defined (__GNUG__)\
|
||||
#include <sys/byteorder.h>\
|
||||
#else /* not __GNUC__ */
|
||||
' \
|
||||
-e '/#endif[ ]*\/\* NETSWAP \*\//i\
|
||||
#endif /* not __GNUC__ */
|
||||
' \
|
||||
$file_to_fix > ${LIB}/${file}.sed
|
||||
rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
|
||||
echo Fixed $file_to_fix
|
||||
fi
|
||||
fi
|
||||
|
||||
# /usr/include/sys/mc_param.h has an embedded asm for the cpuid instruction
|
||||
# on the P5. This is not used by anything else so we ifdef it out.
|
||||
file=sys/mc_param.h
|
||||
if [ -r ${LIB}/$file ]; then
|
||||
file_to_fix=${LIB}/$file
|
||||
else
|
||||
if [ -r ${INPUT}/$file ]; then
|
||||
file_to_fix=${INPUT}/$file
|
||||
else
|
||||
file_to_fix=""
|
||||
fi
|
||||
fi
|
||||
if [ \! -z "$file_to_fix" ]; then
|
||||
echo Checking $file_to_fix
|
||||
if grep __GNUC__ $file_to_fix > /dev/null; then
|
||||
true
|
||||
else
|
||||
sed -e '/__asm/,/}/{
|
||||
/__asm/i\
|
||||
#if !defined (__GNUC__) && !defined (__GNUG__)
|
||||
/}/a\
|
||||
#endif
|
||||
}' \
|
||||
$file_to_fix > ${LIB}/${file}.sed
|
||||
rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
|
||||
echo Fixed $file_to_fix
|
||||
fi
|
||||
fi
|
||||
|
||||
# /usr/include/sys/mc_param.h has an embedded asm for the cpuid instruction
|
||||
# on the P5. This is not used by anything else so we ifdef it out.
|
||||
file=sys/mc_param.h
|
||||
if [ -r ${LIB}/$file ]; then
|
||||
file_to_fix=${LIB}/$file
|
||||
else
|
||||
if [ -r ${INPUT}/$file ]; then
|
||||
file_to_fix=${INPUT}/$file
|
||||
else
|
||||
file_to_fix=""
|
||||
fi
|
||||
fi
|
||||
if [ \! -z "$file_to_fix" ]; then
|
||||
echo Checking $file_to_fix
|
||||
if grep __GNUC__ $file_to_fix > /dev/null; then
|
||||
true
|
||||
else
|
||||
sed -e '/__asm/,/}/{
|
||||
/__asm/i\
|
||||
#if !defined (__GNUC__) && !defined (__GNUG__)
|
||||
/}/a\
|
||||
#endif
|
||||
}' \
|
||||
$file_to_fix > ${LIB}/${file}.sed
|
||||
rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
|
||||
echo Fixed $file_to_fix
|
||||
fi
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
427
gcc/fixinc/fixinc.sco
Executable file
427
gcc/fixinc/fixinc.sco
Executable file
@ -0,0 +1,427 @@
|
||||
#! /bin/sh
|
||||
#
|
||||
# fixinc.sco -- Install modified versions of SCO system include
|
||||
# files.
|
||||
#
|
||||
# Based on fixinc.svr4 script by Ron Guilmette (rfg@ncd.com) (SCO
|
||||
# modifications by Ian Lance Taylor (ian@airs.com)).
|
||||
#
|
||||
# Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of GNU CC.
|
||||
#
|
||||
# GNU CC 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.
|
||||
#
|
||||
# GNU CC 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 GNU CC; see the file COPYING. If not, write to
|
||||
# the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
# Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# This script munges the native include files provided with SCO
|
||||
# 3.2v4 systems so as to provide a reasonable namespace when
|
||||
# compiling with gcc. The header files by default do not
|
||||
# provide many essential definitions and declarations if
|
||||
# __STDC__ is 1. This script modifies the header files to check
|
||||
# for __STRICT_ANSI__ being defined instead. Once munged, the
|
||||
# resulting new system include files are placed in a directory
|
||||
# that GNU C will search *before* searching the /usr/include
|
||||
# directory. This script should work properly for most SCO
|
||||
# 3.2v4 systems. For other types of systems, you should use the
|
||||
# `fixincludes' or the `fixinc.svr4' script instead.
|
||||
#
|
||||
# See README-fixinc for more information.
|
||||
|
||||
# Directory containing the original header files.
|
||||
INPUT=${2-${INPUT-/usr/include}}
|
||||
|
||||
# Fail if no arg to specify a directory for the output.
|
||||
if [ x$1 = x ]
|
||||
then echo fixincludes: no output directory specified
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Directory in which to store the results.
|
||||
LIB=${1?"fixincludes: output directory not specified"}
|
||||
|
||||
# Make sure it exists.
|
||||
if [ ! -d $LIB ]; then
|
||||
mkdir $LIB || exit 1
|
||||
fi
|
||||
|
||||
ORIG_DIR=`pwd`
|
||||
|
||||
# Make LIB absolute if it is relative.
|
||||
# Don't do this if not necessary, since may screw up automounters.
|
||||
case $LIB in
|
||||
/*)
|
||||
;;
|
||||
*)
|
||||
cd $LIB; LIB=`${PWDCMD-pwd}`
|
||||
;;
|
||||
esac
|
||||
|
||||
echo 'Building fixincludes in ' ${LIB}
|
||||
|
||||
# Determine whether this filesystem has symbolic links.
|
||||
if ln -s X $LIB/ShouldNotExist 2>/dev/null; then
|
||||
rm -f $LIB/ShouldNotExist
|
||||
LINKS=true
|
||||
else
|
||||
LINKS=false
|
||||
fi
|
||||
|
||||
echo 'Making directories:'
|
||||
cd ${INPUT}
|
||||
if $LINKS; then
|
||||
files=`ls -LR | sed -n s/:$//p`
|
||||
else
|
||||
files=`find . -type d -print | sed '/^.$/d'`
|
||||
fi
|
||||
for file in $files; do
|
||||
rm -rf $LIB/$file
|
||||
if [ ! -d $LIB/$file ]
|
||||
then mkdir $LIB/$file
|
||||
fi
|
||||
done
|
||||
|
||||
# treetops gets an alternating list
|
||||
# of old directories to copy
|
||||
# and the new directories to copy to.
|
||||
treetops="${INPUT} ${LIB}"
|
||||
|
||||
if $LINKS; then
|
||||
echo 'Making internal symbolic directory links'
|
||||
for file in $files; do
|
||||
dest=`ls -ld $file | sed -n 's/.*-> //p'`
|
||||
if [ "$dest" ]; then
|
||||
cwd=`pwd`
|
||||
# In case $dest is relative, get to $file's dir first.
|
||||
cd ${INPUT}
|
||||
cd `echo ./$file | sed -n 's&[^/]*$&&p'`
|
||||
# Check that the target directory exists.
|
||||
# Redirections changed to avoid bug in sh on Ultrix.
|
||||
(cd $dest) > /dev/null 2>&1
|
||||
if [ $? = 0 ]; then
|
||||
cd $dest
|
||||
# X gets the dir that the link actually leads to.
|
||||
x=`pwd`
|
||||
# If link leads back into ${INPUT},
|
||||
# make a similar link here.
|
||||
if expr $x : "${INPUT}/.*" > /dev/null; then
|
||||
# Y gets the actual target dir name, relative to ${INPUT}.
|
||||
y=`echo $x | sed -n "s&${INPUT}/&&p"`
|
||||
echo $file '->' $y ': Making link'
|
||||
rm -fr ${LIB}/$file > /dev/null 2>&1
|
||||
ln -s ${LIB}/$y ${LIB}/$file > /dev/null 2>&1
|
||||
else
|
||||
# If the link is to outside ${INPUT},
|
||||
# treat this directory as if it actually contained the files.
|
||||
# This line used to have $dest instead of $x.
|
||||
# $dest seemed to be wrong for links found in subdirectories
|
||||
# of ${INPUT}. Does this change break anything?
|
||||
treetops="$treetops $x ${LIB}/$file"
|
||||
fi
|
||||
fi
|
||||
cd $cwd
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
set - $treetops
|
||||
while [ $# != 0 ]; do
|
||||
# $1 is an old directory to copy, and $2 is the new directory to copy to.
|
||||
echo "Finding header files in $1:"
|
||||
cd ${INPUT}
|
||||
cd $1
|
||||
files=`find . -name '*.h' -type f -print`
|
||||
echo 'Checking header files:'
|
||||
for file in $files; do
|
||||
if egrep '!__STDC__' $file >/dev/null; then
|
||||
if [ -r $file ]; then
|
||||
cp $file $2/$file >/dev/null 2>&1 || echo "Can't copy $file"
|
||||
chmod +w $2/$file
|
||||
chmod a+r $2/$file
|
||||
|
||||
# The following have been removed from the sed command below
|
||||
# because it is more useful to leave these things in.
|
||||
# The only reason to remove them was for -pedantic,
|
||||
# which isn't much of a reason. -- rms.
|
||||
# /^[ ]*#[ ]*ident/d
|
||||
|
||||
sed -e '
|
||||
s/!__STDC__/!defined (__STRICT_ANSI__)/g
|
||||
' $2/$file > $2/$file.sed
|
||||
mv $2/$file.sed $2/$file
|
||||
if cmp $file $2/$file >/dev/null 2>&1; then
|
||||
rm $2/$file
|
||||
else
|
||||
echo Fixed $file
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
shift; shift
|
||||
done
|
||||
|
||||
# We shouldn't stay in the directory we just copied.
|
||||
cd ${INPUT}
|
||||
|
||||
# Fix first broken decl of getcwd present on some svr4 systems.
|
||||
|
||||
file=stdlib.h
|
||||
base=`basename $file`
|
||||
if [ -r ${LIB}/$file ]; then
|
||||
file_to_fix=${LIB}/$file
|
||||
else
|
||||
if [ -r ${INPUT}/$file ]; then
|
||||
file_to_fix=${INPUT}/$file
|
||||
else
|
||||
file_to_fix=""
|
||||
fi
|
||||
fi
|
||||
if [ \! -z "$file_to_fix" ]; then
|
||||
echo Checking $file_to_fix
|
||||
sed -e 's/getcwd(char \{0,\}\*, int)/getcwd(char *, size_t)/' $file_to_fix > /tmp/$base
|
||||
if cmp $file_to_fix /tmp/$base >/dev/null 2>&1; then \
|
||||
true
|
||||
else
|
||||
echo Fixed $file_to_fix
|
||||
rm -f ${LIB}/$file
|
||||
cp /tmp/$base ${LIB}/$file
|
||||
chmod a+r ${LIB}/$file
|
||||
fi
|
||||
rm -f /tmp/$base
|
||||
fi
|
||||
|
||||
# Fix second broken decl of getcwd present on some svr4 systems. Also
|
||||
# fix the incorrect decl of profil present on some svr4 systems.
|
||||
|
||||
file=unistd.h
|
||||
base=`basename $file`
|
||||
if [ -r ${LIB}/$file ]; then
|
||||
file_to_fix=${LIB}/$file
|
||||
else
|
||||
if [ -r ${INPUT}/$file ]; then
|
||||
file_to_fix=${INPUT}/$file
|
||||
else
|
||||
file_to_fix=""
|
||||
fi
|
||||
fi
|
||||
if [ \! -z "$file_to_fix" ]; then
|
||||
echo Checking $file_to_fix
|
||||
sed -e 's/getcwd(char \*, int)/getcwd(char *, size_t)/' $file_to_fix \
|
||||
| sed -e 's/profil(unsigned short \*, unsigned int, unsigned int, unsigned int)/profil(unsigned short *, size_t, int, unsigned)/' > /tmp/$base
|
||||
if cmp $file_to_fix /tmp/$base >/dev/null 2>&1; then \
|
||||
true
|
||||
else
|
||||
echo Fixed $file_to_fix
|
||||
rm -f ${LIB}/$file
|
||||
cp /tmp/$base ${LIB}/$file
|
||||
chmod a+r ${LIB}/$file
|
||||
fi
|
||||
rm -f /tmp/$base
|
||||
fi
|
||||
|
||||
# Fix third broken decl of getcwd on SCO. Also fix incorrect decl of
|
||||
# link.
|
||||
file=prototypes.h
|
||||
base=`basename $file`
|
||||
if [ -r ${LIB}/$file ]; then
|
||||
file_to_fix=${LIB}/$file
|
||||
else
|
||||
if [ -r ${INPUT}/$file ]; then
|
||||
file_to_fix=${INPUT}/$file
|
||||
else
|
||||
file_to_fix=""
|
||||
fi
|
||||
fi
|
||||
if [ \! -z "$file_to_fix" ]; then
|
||||
echo Checking $file_to_fix
|
||||
sed -e 's/getcwd(char \*, int)/getcwd(char *, size_t)/' $file_to_fix \
|
||||
| sed -e 's/const int link(const char \*, char \*)/extern int link(const char *, const char *)/' > /tmp/$base
|
||||
if cmp $file_to_fix /tmp/$base >/dev/null 2>&1; then \
|
||||
true
|
||||
else
|
||||
echo Fixed $file_to_fix
|
||||
rm -f ${LIB}/$file
|
||||
cp /tmp/$base ${LIB}/$file
|
||||
chmod a+r ${LIB}/$file
|
||||
fi
|
||||
rm -f /tmp/$base
|
||||
fi
|
||||
|
||||
# Fix an error in this file: the #if says _cplusplus, not the double
|
||||
# underscore __cplusplus that it should be
|
||||
file=tinfo.h
|
||||
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
|
||||
mkdir ${LIB}/rpcsvc 2>/dev/null
|
||||
cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
|
||||
chmod +w ${LIB}/$file 2>/dev/null
|
||||
chmod a+r ${LIB}/$file 2>/dev/null
|
||||
fi
|
||||
|
||||
if [ -r ${LIB}/$file ]; then
|
||||
echo Fixing $file, __cplusplus macro
|
||||
sed -e 's/[ ]_cplusplus/ __cplusplus/' ${LIB}/$file > ${LIB}/${file}.sed
|
||||
rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
|
||||
if cmp $file ${LIB}/$file >/dev/null 2>&1; then
|
||||
rm ${LIB}/$file
|
||||
fi
|
||||
fi
|
||||
|
||||
# Fix prototype declaration of utime in sys/times.h. In 3.2v4.0 the
|
||||
# const is missing.
|
||||
file=sys/times.h
|
||||
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
|
||||
cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
|
||||
chmod +w ${LIB}/$file 2>/dev/null
|
||||
chmod a+r ${LIB}/$file 2>/dev/null
|
||||
fi
|
||||
|
||||
if [ -r ${LIB}/$file ]; then
|
||||
echo Fixing $file, utime prototype
|
||||
sed -e 's/(const char \*, struct utimbuf \*);/(const char *, const struct utimbuf *);/' ${LIB}/$file > ${LIB}/${file}.sed
|
||||
rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
|
||||
if cmp $file ${LIB}/$file >/dev/null 2>&1; then
|
||||
rm ${LIB}/$file
|
||||
fi
|
||||
fi
|
||||
|
||||
# This function is borrowed from fixinclude.svr4
|
||||
# The OpenServer math.h defines struct exception, which conflicts with
|
||||
# the class exception defined in the C++ file std/stdexcept.h. We
|
||||
# redefine it to __math_exception. This is not a great fix, but I
|
||||
# haven't been able to think of anything better.
|
||||
#
|
||||
# OpenServer's math.h declares abs as inline int abs... Unfortunately,
|
||||
# we blow over that one (with C++ linkage) and stick a new one in stdlib.h
|
||||
# with C linkage. So we eat the one out of math.h.
|
||||
file=math.h
|
||||
base=`basename $file`
|
||||
if [ -r ${LIB}/$file ]; then
|
||||
file_to_fix=${LIB}/$file
|
||||
else
|
||||
if [ -r ${INPUT}/$file ]; then
|
||||
file_to_fix=${INPUT}/$file
|
||||
else
|
||||
file_to_fix=""
|
||||
fi
|
||||
fi
|
||||
if [ \! -z "$file_to_fix" ]; then
|
||||
echo Checking $file_to_fix
|
||||
sed -e '/struct exception/i\
|
||||
#ifdef __cplusplus\
|
||||
#define exception __math_exception\
|
||||
#endif'\
|
||||
-e '/struct exception/a\
|
||||
#ifdef __cplusplus\
|
||||
#undef exception\
|
||||
#endif' \
|
||||
-e 's@inline int abs(int [a-z][a-z]*) {.*}@extern "C" int abs(int);@' \
|
||||
$file_to_fix > /tmp/$base
|
||||
if cmp $file_to_fix /tmp/$base >/dev/null 2>&1; then \
|
||||
true
|
||||
else
|
||||
echo Fixed $file_to_fix
|
||||
rm -f ${LIB}/$file
|
||||
cp /tmp/$base ${LIB}/$file
|
||||
chmod a+r ${LIB}/$file
|
||||
fi
|
||||
rm -f /tmp/$base
|
||||
fi
|
||||
|
||||
#
|
||||
# Also, the static functions lstat() and fchmod() in <sys/stat.h>
|
||||
# cause G++ grief since they're not wrapped in "if __cplusplus".
|
||||
# Fix that up now.
|
||||
#
|
||||
file=sys/stat.h
|
||||
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
|
||||
cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
|
||||
chmod +w ${LIB}/$file 2>/dev/null
|
||||
chmod a+r ${LIB}/$file 2>/dev/null
|
||||
fi
|
||||
|
||||
if [ -r ${LIB}/$file ]; then
|
||||
echo Fixing $file, static definitions not C++-aware.
|
||||
sed -e '/^static int[ ]*/i\
|
||||
#if __cplusplus\
|
||||
extern "C"\
|
||||
{\
|
||||
#endif /* __cplusplus */ \
|
||||
' \
|
||||
-e '/^}$/a\
|
||||
#if __cplusplus\
|
||||
}\
|
||||
#endif /* __cplusplus */ \
|
||||
' ${LIB}/$file > ${LIB}/${file}.sed
|
||||
rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
|
||||
if cmp $file ${LIB}/$file >/dev/null 2>&1; then
|
||||
rm -f ${LIB}/$file
|
||||
fi
|
||||
fi
|
||||
|
||||
# This fix has the regex modified from the from fixinc.wrap
|
||||
# Avoid the definition of the bool type in the following files when using
|
||||
# g++, since it's now an official type in the C++ language.
|
||||
for file in term.h tinfo.h
|
||||
do
|
||||
if [ -r $INPUT/$file ]; then
|
||||
echo Checking $INPUT/$file
|
||||
w='[ ]'
|
||||
if grep "typedef$w.*char$w.*bool$w*;" $INPUT/$file >/dev/null
|
||||
then
|
||||
echo Fixed $file
|
||||
rm -f $LIB/$file
|
||||
cat <<'__EOF__' >$LIB/$file
|
||||
#ifndef _CURSES_H_WRAPPER
|
||||
#ifdef __cplusplus
|
||||
# define bool __curses_bool_t
|
||||
#endif
|
||||
#include_next <curses.h>
|
||||
#ifdef __cplusplus
|
||||
# undef bool
|
||||
#endif
|
||||
#define _CURSES_H_WRAPPER
|
||||
#endif /* _CURSES_H_WRAPPER */
|
||||
__EOF__
|
||||
# Define _CURSES_H_WRAPPER at the end of the wrapper, not the start,
|
||||
# so that if #include_next gets another instance of the wrapper,
|
||||
# this will follow the #include_next chain until we arrive at
|
||||
# the real <curses.h>.
|
||||
chmod a+r $LIB/$file
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
echo 'Removing unneeded directories:'
|
||||
cd $LIB
|
||||
files=`find . -type d -print | sort -r`
|
||||
for file in $files; do
|
||||
rmdir $LIB/$file > /dev/null 2>&1
|
||||
done
|
||||
|
||||
if $LINKS; then
|
||||
echo 'Making internal symbolic non-directory links'
|
||||
cd ${INPUT}
|
||||
files=`find . -type l -print`
|
||||
for file in $files; do
|
||||
dest=`ls -ld $file | sed -n 's/.*-> //p'`
|
||||
if expr "$dest" : '[^/].*' > /dev/null; then
|
||||
target=${LIB}/`echo file | sed "s|[^/]*\$|$dest|"`
|
||||
if [ -f $target ]; then
|
||||
ln -s $dest ${LIB}/$file >/dev/null 2>&1
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
exit 0
|
1726
gcc/fixinc/fixinc.svr4
Executable file
1726
gcc/fixinc/fixinc.svr4
Executable file
File diff suppressed because it is too large
Load Diff
232
gcc/fixinc/fixinc.winnt
Normal file
232
gcc/fixinc/fixinc.winnt
Normal file
@ -0,0 +1,232 @@
|
||||
#! sh
|
||||
#
|
||||
# fixinc.winnt -- Install modified versions of Windows NT system include
|
||||
# files.
|
||||
#
|
||||
# Based on fixinc.sco script by Ian Lance Taylor (ian@airs.com)).
|
||||
# Modifications by Douglas Rupp (drupp@cs.washington.edu)
|
||||
#
|
||||
# This file is part of GNU CC.
|
||||
#
|
||||
# GNU CC 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.
|
||||
#
|
||||
# GNU CC 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 GNU CC; see the file COPYING. If not, write to
|
||||
# the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
# Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# This script munges the native include files provided with Windows NT
|
||||
# 3.5 SDK systems so as to provide a reasonable namespace when
|
||||
# compiling with gcc. The header files by default do not
|
||||
# provide many essential definitions and declarations if
|
||||
# __STDC__ is 1. This script modifies the header files to check
|
||||
# for __STRICT_ANSI__ being defined instead. Once munged, the
|
||||
# resulting new system include files are placed in a directory
|
||||
# that GNU C will search *before* searching the Include
|
||||
# directory.
|
||||
#
|
||||
# See README-fixinc for more information.
|
||||
|
||||
ORIG_DIR=`pwd`
|
||||
|
||||
# Directory containing the original header files.
|
||||
cd $2; SEDFILE=`${PWDCMD-pwd}`/fixinc-nt.sed
|
||||
echo $SEDFILE
|
||||
if [ ! -f $SEDFILE ]
|
||||
then echo fixincludes: sed script 'fixinc-nt.sed' not found
|
||||
exit 1
|
||||
fi
|
||||
echo 'Using sed script: ' ${SEDFILE}
|
||||
|
||||
cd $ORIG_DIR
|
||||
|
||||
INPUT=${INCLUDE}
|
||||
echo 'Using the Include environment variable to find header files to fix'
|
||||
|
||||
# Fail if no arg to specify a directory for the output.
|
||||
if [ x$1 = x ]
|
||||
then echo fixincludes: no output directory specified
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Directory in which to store the results.
|
||||
LIB=${1?"fixincludes: output directory not specified"}
|
||||
|
||||
# Make sure it exists.
|
||||
if [ ! -d $LIB ]; then
|
||||
mkdir $LIB || exit 1
|
||||
fi
|
||||
|
||||
ORIG_DIR=`pwd`
|
||||
|
||||
# Make LIB absolute if it is relative.
|
||||
# Don't do this if not necessary, since may screw up automounters.
|
||||
case $LIB in
|
||||
/*)
|
||||
;;
|
||||
*)
|
||||
cd $LIB; LIB=`${PWDCMD-pwd}`
|
||||
;;
|
||||
esac
|
||||
|
||||
echo 'Building fixincludes in ' ${LIB}
|
||||
|
||||
# Determine whether this filesystem has symbolic links.
|
||||
if ln -s X $LIB/ShouldNotExist 2>NUL; then
|
||||
rm -f $LIB/ShouldNotExist
|
||||
LINKS=true
|
||||
else
|
||||
LINKS=false
|
||||
fi
|
||||
|
||||
echo 'Making directories:'
|
||||
cd ${INPUT}
|
||||
if $LINKS; then
|
||||
files=`ls -LR | sed -n s/:$//p`
|
||||
else
|
||||
files=`find . -type d -print | sed '/^.$/d'`
|
||||
fi
|
||||
for file in $files; do
|
||||
rm -rf $LIB/$file
|
||||
if [ ! -d $LIB/$file ]
|
||||
then mkdir $LIB/$file
|
||||
fi
|
||||
done
|
||||
|
||||
# treetops gets an alternating list
|
||||
# of old directories to copy
|
||||
# and the new directories to copy to.
|
||||
treetops="${INPUT} ${LIB}"
|
||||
|
||||
set - $treetops
|
||||
while [ $# != 0 ]; do
|
||||
# $1 is an old directory to copy, and $2 is the new directory to copy to.
|
||||
echo "Finding header files in $1:"
|
||||
cd ${INPUT}
|
||||
cd $1
|
||||
files=`find . -name '*.[hH]' -type f -print`
|
||||
echo 'Checking header files:'
|
||||
for file in $files; do
|
||||
echo $file
|
||||
if egrep "!__STDC__" $file >NUL; then
|
||||
if [ -r $file ]; then
|
||||
cp $file $2/$file >NUL 2>&1 || echo "Can't copy $file"
|
||||
chmod +w,a+r $2/$file
|
||||
|
||||
# The following have been removed from the sed command below
|
||||
# because it is more useful to leave these things in.
|
||||
# The only reason to remove them was for -pedantic,
|
||||
# which isn't much of a reason. -- rms.
|
||||
# /^[ ]*#[ ]*ident/d
|
||||
|
||||
sed -e '
|
||||
s/!__STDC__/!defined (__STRICT_ANSI__)/g
|
||||
' $2/$file > $2/$file.sed
|
||||
mv $2/$file.sed $2/$file
|
||||
if cmp $file $2/$file >NUL 2>&1; then
|
||||
rm $2/$file
|
||||
else
|
||||
echo Fixed $file
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
shift; shift
|
||||
done
|
||||
|
||||
# Fix first broken decl of getcwd present on some svr4 systems.
|
||||
|
||||
file=direct.h
|
||||
base=`basename $file`
|
||||
if [ -r ${LIB}/$file ]; then
|
||||
file_to_fix=${LIB}/$file
|
||||
else
|
||||
if [ -r ${INPUT}/$file ]; then
|
||||
file_to_fix=${INPUT}/$file
|
||||
else
|
||||
file_to_fix=""
|
||||
fi
|
||||
fi
|
||||
if [ \! -z "$file_to_fix" ]; then
|
||||
echo Checking $file_to_fix
|
||||
sed -e 's/getcwd(char \*, int)/getcwd(char *, size_t)/' $file_to_fix > /tmp/$base
|
||||
if cmp $file_to_fix /tmp/$base >NUL 2>&1; then \
|
||||
true
|
||||
else
|
||||
echo Fixed $file_to_fix
|
||||
rm -f ${LIB}/$file
|
||||
cp /tmp/$base ${LIB}/$file
|
||||
chmod a+r ${LIB}/$file
|
||||
fi
|
||||
rm -f /tmp/$base
|
||||
fi
|
||||
|
||||
file=rpcndr.h
|
||||
base=`basename $file`
|
||||
if [ -r ${LIB}/$file ]; then
|
||||
file_to_fix=${LIB}/$file
|
||||
else
|
||||
if [ -r ${INPUT}/$file ]; then
|
||||
file_to_fix=${INPUT}/$file
|
||||
else
|
||||
file_to_fix=""
|
||||
fi
|
||||
fi
|
||||
if [ \! -z "$file_to_fix" ]; then
|
||||
echo Checking $file_to_fix
|
||||
sed -e 's/Format\[\]/Format\[1\]/' $file_to_fix > /tmp/$base
|
||||
if cmp $file_to_fix /tmp/$base >NUL 2>&1; then \
|
||||
true
|
||||
else
|
||||
echo Fixed $file_to_fix
|
||||
rm -f ${LIB}/$file
|
||||
cp /tmp/$base ${LIB}/$file
|
||||
chmod a+r ${LIB}/$file
|
||||
fi
|
||||
rm -f /tmp/$base
|
||||
fi
|
||||
|
||||
file=winnt.h
|
||||
base=`basename $file`
|
||||
if [ -r ${LIB}/$file ]; then
|
||||
file_to_fix=${LIB}/$file
|
||||
else
|
||||
if [ -r ${INPUT}/$file ]; then
|
||||
file_to_fix=${INPUT}/$file
|
||||
else
|
||||
file_to_fix=""
|
||||
fi
|
||||
fi
|
||||
if [ \! -z "$file_to_fix" ]; then
|
||||
echo Checking $file_to_fix
|
||||
sed -e '
|
||||
s/^#if !defined (__cplusplus)/#if 0/
|
||||
s/^#define DECLSPEC_IMPORT __declspec(dllimport)/#define DECLSPEC_IMPORT/
|
||||
' $file_to_fix > /tmp/$base
|
||||
if cmp $file_to_fix /tmp/$base >NUL 2>&1; then \
|
||||
true
|
||||
else
|
||||
echo Fixed $file_to_fix
|
||||
rm -f ${LIB}/$file
|
||||
cp /tmp/$base ${LIB}/$file
|
||||
chmod a+r ${LIB}/$file
|
||||
fi
|
||||
rm -f /tmp/$base
|
||||
fi
|
||||
|
||||
echo 'Removing unneeded directories:'
|
||||
cd $LIB
|
||||
files=`find . -type d -print | sort -r`
|
||||
for file in $files; do
|
||||
rmdir $LIB/$file > NUL 2>&1
|
||||
done
|
||||
|
||||
exit 0
|
86
gcc/fixinc/fixinc.wrap
Executable file
86
gcc/fixinc/fixinc.wrap
Executable file
@ -0,0 +1,86 @@
|
||||
#! /bin/sh
|
||||
# Create wrappers for include files instead of replacing them.
|
||||
#
|
||||
# This script is designed for systems whose include files can be fixed
|
||||
# by creating small wrappers around them.
|
||||
# An advantage of this method is that if the system include files are changed
|
||||
# (e.g. by OS upgrade), you need not re-run fixincludes.
|
||||
#
|
||||
# See README-fixinc for more information.
|
||||
|
||||
# Directory containing the original header files.
|
||||
# (This was named INCLUDES, but that conflicts with a name in Makefile.in.)
|
||||
INPUT=${2-${INPUT-/usr/include}}
|
||||
|
||||
# Directory in which to store the results.
|
||||
LIB=${1?"fixincludes: output directory not specified"}
|
||||
|
||||
# Make sure it exists.
|
||||
if [ ! -d $LIB ]; then
|
||||
mkdir $LIB || exit 1
|
||||
fi
|
||||
|
||||
echo Building fixed headers in ${LIB}
|
||||
|
||||
# Some math.h files define struct exception, which conflicts with
|
||||
# the class exception defined in the C++ file std/stdexcept.h. We
|
||||
# redefine it to __math_exception. This is not a great fix, but I
|
||||
# haven't been able to think of anything better.
|
||||
file=math.h
|
||||
if [ -r $INPUT/$file ]; then
|
||||
echo Checking $INPUT/$file
|
||||
if grep 'struct exception' $INPUT/$file >/dev/null
|
||||
then
|
||||
echo Fixed $file
|
||||
rm -f $LIB/$file
|
||||
cat <<'__EOF__' >$LIB/$file
|
||||
#ifndef _MATH_H_WRAPPER
|
||||
#ifdef __cplusplus
|
||||
# define exception __math_exception
|
||||
#endif
|
||||
#include_next <math.h>
|
||||
#ifdef __cplusplus
|
||||
# undef exception
|
||||
#endif
|
||||
#define _MATH_H_WRAPPER
|
||||
#endif /* _MATH_H_WRAPPER */
|
||||
__EOF__
|
||||
# Define _MATH_H_WRAPPER at the end of the wrapper, not the start,
|
||||
# so that if #include_next gets another instance of the wrapper,
|
||||
# this will follow the #include_next chain until we arrive at
|
||||
# the real <math.h>.
|
||||
chmod a+r $LIB/$file
|
||||
fi
|
||||
fi
|
||||
|
||||
# Avoid the definition of the bool type in the Solaris 2.x curses.h when using
|
||||
# g++, since it's now an official type in the C++ language.
|
||||
file=curses.h
|
||||
if [ -r $INPUT/$file ]; then
|
||||
echo Checking $INPUT/$file
|
||||
w='[ ]'
|
||||
if grep "typedef$w$w*char$w$w*bool$w*;" $INPUT/$file >/dev/null
|
||||
then
|
||||
echo Fixed $file
|
||||
rm -f $LIB/$file
|
||||
cat <<'__EOF__' >$LIB/$file
|
||||
#ifndef _CURSES_H_WRAPPER
|
||||
#ifdef __cplusplus
|
||||
# define bool __curses_bool_t
|
||||
#endif
|
||||
#include_next <curses.h>
|
||||
#ifdef __cplusplus
|
||||
# undef bool
|
||||
#endif
|
||||
#define _CURSES_H_WRAPPER
|
||||
#endif /* _CURSES_H_WRAPPER */
|
||||
__EOF__
|
||||
# Define _CURSES_H_WRAPPER at the end of the wrapper, not the start,
|
||||
# so that if #include_next gets another instance of the wrapper,
|
||||
# this will follow the #include_next chain until we arrive at
|
||||
# the real <curses.h>.
|
||||
chmod a+r $LIB/$file
|
||||
fi
|
||||
fi
|
||||
|
||||
exit 0
|
834
gcc/fixinc/fixincl.c
Normal file
834
gcc/fixinc/fixincl.c
Normal file
@ -0,0 +1,834 @@
|
||||
/*
|
||||
* $Id: fixincl.c,v 1.2 1998/12/16 21:19:03 law Exp $
|
||||
*
|
||||
* Install modified versions of certain ANSI-incompatible system header
|
||||
* files which are fixed to work correctly with ANSI C and placed in a
|
||||
* directory that GNU C will search.
|
||||
*
|
||||
* See README-fixinc for more information.
|
||||
*
|
||||
* fixincl is free software.
|
||||
*
|
||||
* You may 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.
|
||||
*
|
||||
* fixincl 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 fixincl. See the file "COPYING". If not,
|
||||
* write to: The Free Software Foundation, Inc.,
|
||||
* 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include "regex.h"
|
||||
#include "server.h"
|
||||
|
||||
#define tSCC static const char
|
||||
#define tCC const char
|
||||
#define tSC static char
|
||||
|
||||
typedef int tSuccess;
|
||||
|
||||
#define FAILURE ((tSuccess)-1)
|
||||
#define SUCCESS ((tSuccess) 0)
|
||||
#define PROBLEM ((tSuccess) 1)
|
||||
|
||||
#define SUCCEEDED( p ) ((p) == SUCCESS)
|
||||
#define SUCCESSFUL( p ) SUCCEEDED( p )
|
||||
#define FAILED( p ) ((p) < SUCCESS)
|
||||
#define HADGLITCH( p ) ((p) > SUCCESS)
|
||||
|
||||
#define NUL '\0'
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TT_TEST, TT_EGREP, TT_NEGREP
|
||||
}
|
||||
teTestType;
|
||||
|
||||
typedef struct test_desc tTestDesc;
|
||||
|
||||
struct test_desc
|
||||
{
|
||||
teTestType type;
|
||||
const char *pzTest;
|
||||
regex_t *pTestRegex;
|
||||
};
|
||||
|
||||
typedef struct patch_desc tPatchDesc;
|
||||
|
||||
#define FD_MACH_ONLY 0x0000
|
||||
#define FD_MACH_IFNOT 0x0001
|
||||
#define FD_SKIP_TEST 0x8000
|
||||
|
||||
typedef struct fix_desc tFixDesc;
|
||||
struct fix_desc
|
||||
{
|
||||
const char* pzFixName; /* Name of the fix */
|
||||
const char* pzFileList; /* List of files it applies to */
|
||||
const char** papzMachs; /* List of machine/os-es it applies to */
|
||||
regex_t* pListRegex;
|
||||
int testCt;
|
||||
int fdFlags;
|
||||
tTestDesc* pTestDesc;
|
||||
const char** papzPatchArgs;
|
||||
};
|
||||
|
||||
char *pzDestDir = (char *) NULL;
|
||||
char *pzSrcDir = (char *) NULL;
|
||||
char *pzMachine = (char *) NULL;
|
||||
|
||||
pid_t chainHead = (pid_t) - 1;
|
||||
|
||||
const char zInclQuote[] = "^[ \t]*#[ \t]*include[ \t]*\"[^/]";
|
||||
regex_t inclQuoteRegex;
|
||||
|
||||
char zFileNameBuf[0x8000];
|
||||
|
||||
char *loadFile (const char *pzFile);
|
||||
void process (char *data, const char *dir, const char *file);
|
||||
void runCompiles (void);
|
||||
|
||||
#include "fixincl.x"
|
||||
|
||||
|
||||
int
|
||||
main (argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
static const char zGnuLib[] =
|
||||
"This file is part of the GNU C Library";
|
||||
static const char zVarNotFound[] =
|
||||
"fixincl ERROR: %s environment variable not defined\n";
|
||||
|
||||
#ifndef NO_BOGOSITY_LIMITS
|
||||
# define BOGUS_LIMIT 256
|
||||
size_t loopCt;
|
||||
#endif
|
||||
|
||||
char *apzNames[BOGUS_LIMIT];
|
||||
size_t fileNameCt;
|
||||
|
||||
if (argc != 1)
|
||||
{
|
||||
if (argc != 2)
|
||||
{
|
||||
fputs ("fixincl ERROR: too many command line arguments\n", stderr);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (strcmp (argv[1], "-v") == 0)
|
||||
{
|
||||
fputs ("$Id: fixincl.c,v 1.2 1998/12/16 21:19:03 law Exp $\n", stderr);
|
||||
exit (EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
freopen (argv[1], "r", stdin);
|
||||
}
|
||||
|
||||
{
|
||||
static const char zVar[] = "TARGET_MACHINE";
|
||||
pzMachine = getenv( zVar );
|
||||
if (pzMachine == (char *)NULL)
|
||||
{
|
||||
fprintf( stderr, zVarNotFound, zVar );
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
static const char zVar[] = "DESTDIR";
|
||||
pzDestDir = getenv( zVar );
|
||||
if (pzDestDir == (char *)NULL)
|
||||
{
|
||||
fprintf( stderr, zVarNotFound, zVar );
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
static const char zVar[] = "SRCDIR";
|
||||
pzSrcDir = getenv( zVar );
|
||||
if (pzSrcDir == (char *)NULL)
|
||||
{
|
||||
fprintf( stderr, zVarNotFound, zVar );
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
runCompiles ();
|
||||
|
||||
signal ( SIGQUIT, SIG_IGN );
|
||||
signal ( SIGIOT, SIG_IGN );
|
||||
signal ( SIGPIPE, SIG_IGN );
|
||||
signal ( SIGALRM, SIG_IGN );
|
||||
signal ( SIGTERM, SIG_IGN );
|
||||
signal ( SIGCHLD, SIG_IGN );
|
||||
|
||||
#ifndef NO_BOGOSITY_LIMITS
|
||||
for (;;)
|
||||
{
|
||||
char *pzBuf;
|
||||
pid_t child;
|
||||
|
||||
/*
|
||||
* Only the parent process can read from stdin without
|
||||
* confusing the world. (How does the child tell the
|
||||
* parent to skip forward? Pipes and files behave differently.)
|
||||
*/
|
||||
for (fileNameCt = 0, pzBuf = zFileNameBuf;
|
||||
(fileNameCt < BOGUS_LIMIT)
|
||||
&& (pzBuf
|
||||
< (zFileNameBuf + sizeof (zFileNameBuf) - MAXPATHLEN));
|
||||
)
|
||||
{
|
||||
|
||||
if (fgets (pzBuf, MAXPATHLEN, stdin) == (char *) NULL)
|
||||
break;
|
||||
while (isspace (*pzBuf))
|
||||
pzBuf++;
|
||||
apzNames[fileNameCt++] = pzBuf;
|
||||
pzBuf += strlen (pzBuf);
|
||||
while (isspace (pzBuf[-1]))
|
||||
pzBuf--;
|
||||
*pzBuf++ = '\0';
|
||||
}
|
||||
|
||||
if (fileNameCt == 0)
|
||||
return EXIT_SUCCESS;
|
||||
|
||||
child = fork ();
|
||||
if (child == NULLPROCESS)
|
||||
break;
|
||||
|
||||
if (child == NOPROCESS)
|
||||
{
|
||||
fprintf (stderr, "Error %d (%s) forking in main\n",
|
||||
errno, strerror (errno));
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
waitpid (child, (int *) NULL, 0);
|
||||
}
|
||||
#else
|
||||
#error "NON-BOGUS LIMITS NOT SUPPORTED?!?!"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* For every file specified in stdandard in
|
||||
* (except as throttled for bogus reasons)...
|
||||
*/
|
||||
for (loopCt = 0; loopCt < fileNameCt; loopCt++)
|
||||
{
|
||||
char *pzData;
|
||||
char *pzFile = apzNames[loopCt];
|
||||
|
||||
if (access (pzFile, R_OK) != 0)
|
||||
{
|
||||
int erno = errno;
|
||||
fprintf (stderr, "Cannot access %s from %s\n\terror %d (%s)\n",
|
||||
pzFile, getcwd ((char *) NULL, MAXPATHLEN),
|
||||
erno, strerror (erno));
|
||||
}
|
||||
else if (pzData = loadFile (pzFile),
|
||||
(pzData != (char *) NULL))
|
||||
{
|
||||
|
||||
if (strstr (pzData, zGnuLib) == (char *) NULL)
|
||||
process (pzData, pzDestDir, pzFile);
|
||||
|
||||
free ((void *) pzData);
|
||||
}
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
char *
|
||||
loadFile (pzFile)
|
||||
const char *pzFile;
|
||||
{
|
||||
char *pzDta;
|
||||
size_t fileSize;
|
||||
|
||||
{
|
||||
struct stat stbf;
|
||||
if (stat (pzFile, &stbf) != 0)
|
||||
{
|
||||
fprintf (stderr, "error %d (%s) stat-ing %s\n",
|
||||
errno, strerror (errno), pzFile);
|
||||
return (char *) NULL;
|
||||
}
|
||||
fileSize = stbf.st_size;
|
||||
}
|
||||
if (fileSize == 0)
|
||||
return (char *) NULL;
|
||||
|
||||
pzDta = (char *) malloc ((fileSize + 16) & ~0x00F);
|
||||
if (pzDta == (char *) NULL)
|
||||
{
|
||||
fprintf (stderr, "error: could not malloc %d bytes\n",
|
||||
fileSize);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
{
|
||||
FILE *fp = fopen (pzFile, "r");
|
||||
size_t sizeLeft = fileSize;
|
||||
char *readPtr = pzDta;
|
||||
|
||||
if (fp == (FILE *) NULL)
|
||||
{
|
||||
fprintf (stderr, "error %d (%s) opening %s\n", errno,
|
||||
strerror (errno), pzFile);
|
||||
free ((void *) pzDta);
|
||||
return (char *) NULL;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
size_t sizeRead = fread ((void *) readPtr, 1, sizeLeft, fp);
|
||||
|
||||
if (sizeRead == 0)
|
||||
{
|
||||
if (feof (fp))
|
||||
break;
|
||||
|
||||
if (ferror (fp))
|
||||
{
|
||||
fprintf (stderr, "error %d (%s) reading %s\n", errno,
|
||||
strerror (errno), pzFile);
|
||||
free ((void *) pzDta);
|
||||
fclose (fp);
|
||||
return (char *) NULL;
|
||||
}
|
||||
}
|
||||
|
||||
readPtr += sizeRead;
|
||||
sizeLeft -= sizeRead;
|
||||
}
|
||||
while (sizeLeft != 0);
|
||||
|
||||
*readPtr = '\0';
|
||||
fclose (fp);
|
||||
return pzDta;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
runCompiles ()
|
||||
{
|
||||
tSCC zBadComp[] = "fixincl ERROR: cannot compile %s regex for %s\n"
|
||||
"\texpr = `%s'\n" "\terror %s\n";
|
||||
tFixDesc *pFD = fixDescList;
|
||||
int fixCt = FIX_COUNT;
|
||||
tTestDesc *pTD;
|
||||
int tstCt;
|
||||
int reCt = REGEX_COUNT;
|
||||
const char *pzErr;
|
||||
regex_t *pRegex = (regex_t *) malloc (REGEX_COUNT * sizeof (regex_t));
|
||||
|
||||
if (pRegex == (regex_t *) NULL)
|
||||
{
|
||||
fprintf (stderr, "fixincl ERROR: cannot allocate %d bytes for regex\n",
|
||||
REGEX_COUNT * sizeof (regex_t));
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
re_set_syntax (RE_SYNTAX_EGREP);
|
||||
pzErr = re_compile_pattern (zInclQuote, strlen (zInclQuote),
|
||||
&inclQuoteRegex);
|
||||
if (pzErr != (char *) NULL)
|
||||
{
|
||||
fprintf (stderr, zBadComp, "quoted include", "runCompiles",
|
||||
zInclQuote, pzErr);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/*
|
||||
* FOR every fixup, ...
|
||||
*/
|
||||
do
|
||||
{
|
||||
pTD = pFD->pTestDesc;
|
||||
tstCt = pFD->testCt;
|
||||
|
||||
if (pFD->papzMachs != (const char**)NULL) {
|
||||
const char** papzMachs = pFD->papzMachs;
|
||||
char* pz = zFileNameBuf;
|
||||
char* pzSep = "";
|
||||
tCC* pzIfTrue;
|
||||
tCC* pzIfFalse;
|
||||
tSCC zSkip[] = "skip";
|
||||
tSCC zRun[] = "run";
|
||||
|
||||
sprintf( pz, "case %s in\n", pzMachine );
|
||||
pz += strlen( pz );
|
||||
|
||||
if (pFD->fdFlags & FD_MACH_IFNOT) {
|
||||
pzIfTrue = zSkip;
|
||||
pzIfFalse = zRun;
|
||||
} else {
|
||||
pzIfTrue = zRun;
|
||||
pzIfFalse = zSkip;
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
const char* pzMach = *(papzMachs++);
|
||||
if (pzMach == (const char*)NULL)
|
||||
break;
|
||||
sprintf( pz, "%s %s", pzSep, pzMach );
|
||||
pz += strlen( pz );
|
||||
pzSep = " | \\\n";
|
||||
}
|
||||
sprintf( pz, " )\n echo %s ;;\n * )\n echo %s ;;\nesac",
|
||||
pzIfTrue, pzIfFalse );
|
||||
pz = runShell( zFileNameBuf );
|
||||
if (*pz == 's') {
|
||||
pFD->fdFlags |= FD_SKIP_TEST;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* FOR every test for the fixup, ...
|
||||
*/
|
||||
while (--tstCt >= 0)
|
||||
{
|
||||
switch (pTD->type)
|
||||
{
|
||||
case TT_EGREP:
|
||||
case TT_NEGREP:
|
||||
if (--reCt < 0)
|
||||
{
|
||||
fputs ("out of RE's\n", stderr);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
pTD->pTestRegex = pRegex++;
|
||||
pzErr = re_compile_pattern (pTD->pzTest,
|
||||
strlen (pTD->pzTest),
|
||||
pTD->pTestRegex);
|
||||
if (pzErr != (char *) NULL)
|
||||
{
|
||||
fprintf (stderr, zBadComp, "select test", pFD->pzFixName,
|
||||
pTD->pzTest, pzErr);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
pTD++;
|
||||
}
|
||||
}
|
||||
while (pFD++, --fixCt > 0);
|
||||
}
|
||||
|
||||
|
||||
FILE *
|
||||
createFile (pzFile)
|
||||
const char *pzFile;
|
||||
{
|
||||
int fd;
|
||||
FILE *pf;
|
||||
char fname[MAXPATHLEN];
|
||||
|
||||
sprintf (fname, "%s/%s", pzDestDir, pzFile);
|
||||
unlink (fname);
|
||||
|
||||
fd = open (fname, O_WRONLY | O_CREAT);
|
||||
|
||||
if ((fd < 0) && (errno == ENOENT))
|
||||
{
|
||||
char *pzDir = strchr (fname + 1, '/');
|
||||
struct stat stbf;
|
||||
|
||||
while (pzDir != (char *) NULL)
|
||||
{
|
||||
*pzDir = NUL;
|
||||
if (stat (fname, &stbf) < 0)
|
||||
{
|
||||
mkdir (fname, S_IFDIR | S_IRWXU | S_IRGRP | S_IXGRP
|
||||
| S_IROTH | S_IXOTH);
|
||||
}
|
||||
|
||||
*pzDir = '/';
|
||||
pzDir = strchr (pzDir + 1, '/');
|
||||
}
|
||||
fd = open (fname, O_WRONLY | O_CREAT);
|
||||
}
|
||||
if (fd < 0)
|
||||
{
|
||||
fprintf (stderr, "Error %d (%s) creating %s\n",
|
||||
errno, strerror (errno), fname);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
fprintf (stderr, "Fixed: %s\n", pzFile);
|
||||
pf = fdopen (fd, "w");
|
||||
|
||||
#ifdef LATER
|
||||
{
|
||||
static const char zHdr[] =
|
||||
"/*\n"
|
||||
" * DO NOT EDIT THIS FILE.\n"
|
||||
" *\n"
|
||||
" * It has been auto-edited by fixincludes from /usr/include/%s\n"
|
||||
" * This had to be done to correct non-standard usages in the\n"
|
||||
" * original, manufacturer supplied header file.\n"
|
||||
" */\n\n";
|
||||
|
||||
fprintf (pf, zHdr, pzFile);
|
||||
}
|
||||
#endif
|
||||
return pf;
|
||||
}
|
||||
|
||||
tSuccess
|
||||
testTest (pTest, pzFile)
|
||||
tTestDesc *pTest;
|
||||
char* pzFile;
|
||||
{
|
||||
char *pzRes;
|
||||
tSuccess res = FAILURE;
|
||||
|
||||
static char zCmdBuf[4096];
|
||||
tSCC zCmdFmt[] = "file=%s\nif ( test %s ) > /dev/null 2>&1\n"
|
||||
"then echo TRUE\n" "else echo FALSE\n" "fi";
|
||||
|
||||
sprintf (zCmdBuf, zCmdFmt, pzFile, pTest->pzTest);
|
||||
pzRes = runShell (zCmdBuf);
|
||||
if (*pzRes == 'T')
|
||||
res = SUCCESS;
|
||||
free ((void *) pzRes);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
tSuccess
|
||||
egrepTest (pzDta, pTest)
|
||||
char *pzDta;
|
||||
tTestDesc *pTest;
|
||||
{
|
||||
regmatch_t match;
|
||||
#ifndef NO_BOGOSITY
|
||||
if (pTest->pTestRegex == 0)
|
||||
fprintf (stderr, "fixincl ERROR RE not compiled: `%s'\n", pTest->pzTest);
|
||||
#endif
|
||||
if (regexec (pTest->pTestRegex, pzDta, 1, &match, 0) == 0)
|
||||
return SUCCESS;
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
extractQuotedFiles (pzDta, pzFile, pMatch)
|
||||
char *pzDta;
|
||||
const char *pzFile;
|
||||
regmatch_t *pMatch;
|
||||
{
|
||||
char *pzDirEnd = strrchr (pzFile, '/');
|
||||
char *pzInclQuot = pzDta;
|
||||
|
||||
fprintf (stderr, "Quoted includes in %s\n", pzFile);
|
||||
|
||||
/*
|
||||
* Set "pzFile" to point to the containing subdirectory of the source
|
||||
* If there is none, then it is in our current direcory, ".".
|
||||
*/
|
||||
if (pzDirEnd == (char *) NULL)
|
||||
pzFile = ".";
|
||||
else
|
||||
*pzDirEnd = '\0';
|
||||
|
||||
for (;;)
|
||||
{
|
||||
pzInclQuot += pMatch->rm_so;
|
||||
|
||||
/*
|
||||
* Skip forward to the included file name
|
||||
*/
|
||||
while (isspace (*pzInclQuot))
|
||||
pzInclQuot++;
|
||||
while (isspace (*++pzInclQuot));
|
||||
pzInclQuot += sizeof ("include") - 1;
|
||||
while (*pzInclQuot++ != '"');
|
||||
|
||||
/*
|
||||
* Print the source directory and the subdirectory of the file
|
||||
* in question.
|
||||
*/
|
||||
printf ("%s %s/", pzSrcDir, pzFile);
|
||||
pzDirEnd = pzInclQuot;
|
||||
|
||||
/*
|
||||
* Append to the directory the relative path of the desired file
|
||||
*/
|
||||
while (*pzInclQuot != '"')
|
||||
putc (*pzInclQuot++, stdout);
|
||||
|
||||
/*
|
||||
* Now print the destination directory appended with the relative
|
||||
* path of the desired file
|
||||
*/
|
||||
printf (" %s/%s/", pzDestDir, pzFile);
|
||||
while (*pzDirEnd != '"')
|
||||
putc (*pzDirEnd++, stdout);
|
||||
|
||||
/*
|
||||
* End of entry
|
||||
*/
|
||||
putc ('\n', stdout);
|
||||
|
||||
/*
|
||||
* Find the next entry
|
||||
*/
|
||||
if (regexec (&inclQuoteRegex, pzInclQuot, 1, pMatch, 0) != 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Process the potential fixes for a particular include file
|
||||
*/
|
||||
void
|
||||
process (pzDta, pzDir, pzFile)
|
||||
char *pzDta;
|
||||
const char *pzDir;
|
||||
const char *pzFile;
|
||||
{
|
||||
static char zEnvFile[1024] =
|
||||
{"file="};
|
||||
tFixDesc *pFD = fixDescList;
|
||||
int todoCt = FIX_COUNT;
|
||||
tFdPair fdp =
|
||||
{-1, -1};
|
||||
|
||||
/*
|
||||
* IF this is the first time through,
|
||||
* THEN put the 'file' environment variable into the environment.
|
||||
* This is used by some of the subject shell scripts and tests.
|
||||
*/
|
||||
if (zEnvFile[5] == NUL)
|
||||
putenv (zEnvFile);
|
||||
|
||||
/*
|
||||
* Ghastly as it is, this actually updates the value of the variable:
|
||||
*
|
||||
* putenv(3C) C Library Functions putenv(3C)
|
||||
*
|
||||
* DESCRIPTION
|
||||
* putenv() makes the value of the environment variable name
|
||||
* equal to value by altering an existing variable or creating
|
||||
* a new one. In either case, the string pointed to by string
|
||||
* becomes part of the environment, so altering the string will
|
||||
* change the environment. string points to a string of the
|
||||
* form ``name=value.'' The space used by string is no longer
|
||||
* used once a new string-defining name is passed to putenv().
|
||||
*/
|
||||
strcpy (zEnvFile + 5, pzFile);
|
||||
chainHead = NOPROCESS;
|
||||
|
||||
/*
|
||||
* For every fix in our fix list, ...
|
||||
*/
|
||||
for (; todoCt > 0; pFD++, todoCt--)
|
||||
{
|
||||
tTestDesc *pTD;
|
||||
int tstCt;
|
||||
tSuccess egrepRes;
|
||||
|
||||
if (pFD->fdFlags & FD_SKIP_TEST)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* IF there is a file name restriction,
|
||||
* THEN ensure the current file name matches one in the pattern
|
||||
*/
|
||||
if (pFD->pzFileList != (char *) NULL)
|
||||
{
|
||||
const char *pzFil = pzFile;
|
||||
const char *pzScn = pFD->pzFileList;
|
||||
size_t nmLen;
|
||||
|
||||
while ((pzFil[0] == '.') && (pzFil[1] == '/'))
|
||||
pzFil += 2;
|
||||
nmLen = strlen (pzFil);
|
||||
|
||||
for (;;)
|
||||
{
|
||||
pzScn = strstr (pzScn + 1, pzFil);
|
||||
if (pzScn == (char *) NULL)
|
||||
goto nextFix;
|
||||
|
||||
if ((pzScn[-1] == '|') && (pzScn[nmLen] == '|'))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
egrepRes = PROBLEM;
|
||||
|
||||
/*
|
||||
* IF there are no tests
|
||||
* THEN we always run the fixup
|
||||
*/
|
||||
for (pTD = pFD->pTestDesc, tstCt = pFD->testCt;
|
||||
tstCt-- > 0;
|
||||
pTD++)
|
||||
{
|
||||
switch (pTD->type)
|
||||
{
|
||||
case TT_TEST:
|
||||
/*
|
||||
* IF *any* of the shell tests fail,
|
||||
* THEN do not process the fix.
|
||||
*/
|
||||
if (!SUCCESSFUL (testTest (pTD, pzFile)))
|
||||
goto nextFix;
|
||||
break;
|
||||
|
||||
case TT_EGREP:
|
||||
/*
|
||||
* IF we have not had a successful egrep test
|
||||
* *AND* this test does not pass,
|
||||
* THEN mark the egrep test as failing. It starts
|
||||
* out as a "PROBLEM", meaning that if we do not
|
||||
* encounter any egrep tests, then we will let it pass.
|
||||
*/
|
||||
if ((!SUCCESSFUL (egrepRes))
|
||||
&& (!SUCCESSFUL (egrepTest (pzDta, pTD))))
|
||||
|
||||
egrepRes = FAILURE;
|
||||
|
||||
break;
|
||||
|
||||
case TT_NEGREP:
|
||||
/*
|
||||
* IF *any* of the negative egrep tests fail,
|
||||
* THEN do not process the fix.
|
||||
*/
|
||||
if (SUCCESSFUL (egrepTest (pzDta, pTD)))
|
||||
goto nextFix;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* IF there were no egrep tests *OR* at least one passed, ...
|
||||
*/
|
||||
if (!FAILED (egrepRes))
|
||||
{
|
||||
fprintf (stderr, "Applying %-32s to %s\n",
|
||||
pFD->pzFixName, pzFile);
|
||||
|
||||
if (fdp.readFd == -1)
|
||||
{
|
||||
fdp.readFd = open (pzFile, O_RDONLY);
|
||||
if (fdp.readFd < 0)
|
||||
{
|
||||
fprintf (stderr, "Error %d (%s) opening %s\n", errno,
|
||||
strerror (errno), pzFile);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
for (;;)
|
||||
{
|
||||
int newFd = chainOpen (fdp.readFd,
|
||||
(tpChar *) pFD->papzPatchArgs,
|
||||
(chainHead == -1)
|
||||
? &chainHead : (pid_t *) NULL);
|
||||
if (newFd != -1)
|
||||
{
|
||||
fdp.readFd = newFd;
|
||||
break;
|
||||
}
|
||||
|
||||
fprintf (stderr, "Error %d (%s) starting filter process "
|
||||
"for %s\n", errno, strerror (errno),
|
||||
pFD->pzFixName);
|
||||
|
||||
if (errno != EAGAIN)
|
||||
exit (EXIT_FAILURE);
|
||||
sleep (1);
|
||||
}
|
||||
}
|
||||
|
||||
nextFix:;
|
||||
}
|
||||
|
||||
/*
|
||||
* IF after all the tests we did not start any patch programs,
|
||||
* THEN quit now.
|
||||
*/
|
||||
if (fdp.readFd < 0)
|
||||
return;
|
||||
|
||||
{
|
||||
FILE *inFp = fdopen (fdp.readFd, "r");
|
||||
FILE *oFp = (FILE *) NULL;
|
||||
char *pzCmp = pzDta;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
int ch;
|
||||
|
||||
ch = getc (inFp);
|
||||
if (ch == EOF)
|
||||
break;
|
||||
|
||||
if (oFp != (FILE *) NULL)
|
||||
putc (ch, oFp);
|
||||
|
||||
else if (ch != *pzCmp)
|
||||
{
|
||||
oFp = createFile (pzFile);
|
||||
if (pzCmp != pzDta)
|
||||
{
|
||||
char c = *pzCmp;
|
||||
*pzCmp = NUL;
|
||||
fputs (pzDta, oFp);
|
||||
*pzCmp = c;
|
||||
}
|
||||
putc (ch, oFp);
|
||||
|
||||
}
|
||||
else
|
||||
pzCmp++;
|
||||
}
|
||||
|
||||
if (oFp != (FILE *) NULL)
|
||||
{
|
||||
regmatch_t match;
|
||||
|
||||
fchmod (fileno (oFp), S_IRUSR | S_IRGRP | S_IROTH);
|
||||
fclose (oFp);
|
||||
if (regexec (&inclQuoteRegex, pzDta, 1, &match, 0) == 0)
|
||||
extractQuotedFiles (pzDta, pzFile, &match);
|
||||
}
|
||||
|
||||
fclose (inFp);
|
||||
}
|
||||
|
||||
close (fdp.readFd);
|
||||
}
|
169
gcc/fixinc/fixincl.tpl
Normal file
169
gcc/fixinc/fixincl.tpl
Normal file
@ -0,0 +1,169 @@
|
||||
[= autogen template -*- Mode: C -*-
|
||||
x =]
|
||||
/*
|
||||
[= _eval "# * " _DNE =]
|
||||
*
|
||||
* Install modified versions of certain ANSI-incompatible system header
|
||||
* files which are fixed to work correctly with ANSI C and placed in a
|
||||
* directory that GNU C will search.
|
||||
*
|
||||
* This script contains [=_eval fix _hilim 1 +=] fixup scripts.
|
||||
*
|
||||
* See README-fixinc for more information.
|
||||
*
|
||||
[=_eval inclhack "# * " _gpl=]
|
||||
*[=
|
||||
|
||||
|
||||
_FOR fix =]
|
||||
*
|
||||
* Description [=_eval _index 1 + "#%3d -" _printf=] [=hackname _Cap=] fix
|
||||
*/
|
||||
tSCC z[=hackname _cap=]Name[] =
|
||||
[=hackname _cap _str=];
|
||||
/*
|
||||
* File name selection pattern
|
||||
*/[=
|
||||
|
||||
_IF files _exist=]
|
||||
tSCC z[=hackname _cap=]List[] =[=
|
||||
_FOR files=]
|
||||
"|" [=files _str=][=
|
||||
/files=] "|";[=
|
||||
|
||||
_ELSE =]
|
||||
#define z[=hackname _cap=]List (char*)NULL[=
|
||||
_ENDIF "files _exist" =]
|
||||
/*
|
||||
* Machine/OS name selection pattern
|
||||
*/[=
|
||||
|
||||
_IF mach _exist=]
|
||||
tSCC* apz[=hackname _cap=]Machs[] = {[=
|
||||
_FOR mach =]
|
||||
[=mach _str=],[=
|
||||
/mach=]
|
||||
(const char*)NULL };[=
|
||||
|
||||
_ELSE =]
|
||||
#define apz[=hackname _cap=]Machs (const char**)NULL[=
|
||||
_ENDIF "files _exist" =][=
|
||||
|
||||
_IF exesel _exist=]
|
||||
|
||||
/*
|
||||
* content selection pattern
|
||||
*/[=
|
||||
_FOR exesel =]
|
||||
tSCC z[=hackname _cap=]Select[=_eval _index=][] =
|
||||
[=exesel _str=];[=
|
||||
/exesel =][=
|
||||
|
||||
_ELIF select _exist=]
|
||||
|
||||
/*
|
||||
* content selection pattern
|
||||
*/[=
|
||||
_FOR select =]
|
||||
tSCC z[=hackname _cap=]Select[=_eval _index=][] =
|
||||
[=select _str=];[=
|
||||
/select =][=
|
||||
_ENDIF =][=
|
||||
|
||||
_IF bypass _exist=]
|
||||
|
||||
/*
|
||||
* content bypass pattern
|
||||
*/[=
|
||||
_FOR bypass =]
|
||||
tSCC z[=hackname _cap=]Bypass[=_eval _index=][] =
|
||||
[=bypass _str=];[=
|
||||
/bypass =][=
|
||||
_ENDIF =][=
|
||||
|
||||
_IF test _exist=]
|
||||
|
||||
/*
|
||||
* content test pattern. A shell will deal with it later.
|
||||
*/[=
|
||||
_FOR test =]
|
||||
tSCC z[=hackname _cap=]Test[=_eval _index=][] =
|
||||
[=test _str=];[=
|
||||
/test =][=
|
||||
_ENDIF =][=
|
||||
|
||||
_IF exesel _exist select _exist bypass _exist test _exist | | |
|
||||
=]
|
||||
|
||||
#define [=hackname _up =]_TEST_CT [=
|
||||
_IF exesel _exist =][=
|
||||
_eval test _count bypass _count exesel _count + + =][=
|
||||
_ELSE =][=
|
||||
_eval test _count bypass _count select _count + + =][=
|
||||
_ENDIF =]
|
||||
tTestDesc a[=hackname _cap=]Tests[] = {[=
|
||||
|
||||
_IF test _exist =][=
|
||||
_FOR test=]
|
||||
{ TT_TEST, z[=hackname _cap=]Test[=_eval _index=], 0 /* unused */ },[=
|
||||
/test =][=
|
||||
_ENDIF =][=
|
||||
|
||||
_IF bypass _exist =][=
|
||||
_FOR bypass=]
|
||||
{ TT_NEGREP, z[=hackname _cap=]Bypass[=_eval _index=], (regex_t*)NULL },[=
|
||||
/bypass =][=
|
||||
_ENDIF =][=
|
||||
|
||||
_IF exesel _exist =][=
|
||||
_FOR exesel ,=]
|
||||
{ TT_EGREP, z[=hackname _cap=]Select[=_eval _index=], (regex_t*)NULL }[=
|
||||
/exesel =][=
|
||||
|
||||
_ELIF select _exist =][=
|
||||
_FOR select ,=]
|
||||
{ TT_EGREP, z[=hackname _cap=]Select[=_eval _index=], (regex_t*)NULL }[=
|
||||
/select =][=
|
||||
_ENDIF =] };[=
|
||||
_ELSE =]
|
||||
#define [=hackname _up=]_TEST_CT 0
|
||||
#define a[=hackname _cap=]Tests (tTestDesc*)NULL[=
|
||||
_ENDIF =]
|
||||
|
||||
/*
|
||||
* Fix Command Arguments for [=hackname _cap=]
|
||||
*/
|
||||
const char* apz[=hackname _cap=]Patch[] = {[=
|
||||
_IF sed _exist =] "sed"[=_FOR sed=],
|
||||
"-e" [=sed _str=][=/sed=][=
|
||||
_ELIF replacement _exist =] "sed",
|
||||
"s@[=select[]=]@[=replacement=]@"[=
|
||||
_ELIF shell _exist =] "sh", "-c",
|
||||
[=shell _str=][=
|
||||
_ELSE =][=_ERROR hackname _get "Error: %s has two fixup specifications"
|
||||
_printf =][=
|
||||
_ENDIF=],
|
||||
(char*)NULL };
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * *[=
|
||||
/fix=]
|
||||
*
|
||||
* List of all fixes
|
||||
*/
|
||||
#define REGEX_COUNT [=_eval fix.select _count
|
||||
fix.bypass _count + =]
|
||||
#define FIX_COUNT [=_eval fix _count =]
|
||||
tFixDesc fixDescList[ [=_eval fix _count =] ] = {[=
|
||||
|
||||
|
||||
_FOR fix ",\n" =]
|
||||
{ z[=hackname _cap=]Name, z[=hackname _cap=]List,
|
||||
apz[=hackname _cap=]Machs, (regex_t*)NULL,
|
||||
[=hackname _up=]_TEST_CT, [=
|
||||
_IF not_machine _exist =]FD_MACH_IFNOT[=
|
||||
_ELSE =]FD_MACH_ONLY[=
|
||||
_ENDIF =],
|
||||
a[=hackname _cap=]Tests, apz[=hackname _cap=]Patch }[=
|
||||
|
||||
/fix=]
|
||||
};
|
186
gcc/fixinc/hackshell.tpl
Normal file
186
gcc/fixinc/hackshell.tpl
Normal file
@ -0,0 +1,186 @@
|
||||
[= autogen template include =]
|
||||
[=
|
||||
# $Id: hackshell.tpl,v 1.2 1998/12/16 21:19:08 law Exp $
|
||||
#
|
||||
# This file contanes the shell template replacement for the
|
||||
# fixincl program. It is the repetitive guts of the fixincludes logic.
|
||||
#
|
||||
=]
|
||||
if $LINKS; then
|
||||
files=`find . -name '*.h' \( -type f -o -type l \) -print`
|
||||
else
|
||||
files=`find . -name '*.h' -type f -print`
|
||||
fi
|
||||
echo Checking header files
|
||||
for file in $files; do
|
||||
|
||||
if ( test ! -r $file -o \
|
||||
-n "`fgrep 'This file is part of the GNU C Library' $file`" )
|
||||
then continue ; fi
|
||||
|
||||
fixlist=""
|
||||
[=
|
||||
#
|
||||
# FOR every fix description,
|
||||
# DO: emit the shell text to apply the fix to the current file
|
||||
#
|
||||
# =][=
|
||||
|
||||
_FOR fix "\n\n" =]
|
||||
#
|
||||
# Fix [=_eval _index 1 + #%3d _printf=]: [=hackname _Cap=]
|
||||
#[=
|
||||
_IF files _exist=]
|
||||
case "$file" in [=_FOR files " | \\\n\t"=]./[=files=][=/files=] )[=
|
||||
_ENDIF=][=
|
||||
|
||||
_IF mach _exist=]
|
||||
case "$target_canonical" in [=
|
||||
_FOR mach " | \\\n\t" =][=
|
||||
mach =][=
|
||||
/mach =] )[=
|
||||
_IF mach_unmatched _exist =] : ;;
|
||||
* )[=
|
||||
_ENDIF =][=
|
||||
|
||||
_ENDIF=][=
|
||||
|
||||
# There are three conditional tests: select, bypass and test.
|
||||
They may appear as often as desired. They must all pass for
|
||||
the fix to be applied. "select" and "bypass" are egrep expressions
|
||||
that must each appear (or not appear) in the target file.
|
||||
"test" is an arbitrary test program expression that must yield
|
||||
true or false. It is enclosed in parenthesis to avoid
|
||||
precedence problems. The output looks like this:
|
||||
|
||||
if ( test -n "`egrep 'find-expr' $file`" -a
|
||||
-z "`egrep 'not-find' $file`" -a
|
||||
'(' <some-test-expression> ')'
|
||||
) > /dev/null 2>&1 ; then
|
||||
|
||||
# =][=
|
||||
|
||||
_IF select _exist =]
|
||||
if ( test [=
|
||||
_FOR select " -a \\\n "
|
||||
=]-n [=select _shrstr "#`egrep %s $file`"
|
||||
_printf _shstr =][=
|
||||
/select=][=
|
||||
|
||||
_IF bypass _exist =][=
|
||||
_FOR bypass=] -a \
|
||||
-z [=bypass _shrstr "#`egrep %s $file`"
|
||||
_printf _shstr =][=
|
||||
/bypass=][=
|
||||
_ENDIF=][=
|
||||
|
||||
_IF test _exist=][=
|
||||
_FOR test=] -a \
|
||||
'(' [=test=] ')'[=
|
||||
/test=][=
|
||||
_ENDIF=]
|
||||
) > /dev/null 2>&1 ; then[=
|
||||
|
||||
|
||||
_ELIF test _exist =]
|
||||
if ( test [=
|
||||
_FOR test " -a \\\n "
|
||||
=]'(' [=test=] ')'[=
|
||||
/test=][=
|
||||
|
||||
_IF bypass _exist=][=
|
||||
_FOR bypass=] -a \
|
||||
-z [=bypass _shrstr "#`egrep %s $file`"
|
||||
_printf _shstr=][=
|
||||
/bypass=][=
|
||||
_ENDIF=]
|
||||
) > /dev/null 2>&1 ; then[=
|
||||
|
||||
|
||||
_ELIF bypass _exist =]
|
||||
if ( test [=_FOR bypass " -a \\\n "
|
||||
=]-z [=bypass _shrstr "#`egrep %s $file`"
|
||||
_printf _shstr=][=/bypass=]
|
||||
) > /dev/null 2>&1 ; then[=
|
||||
|
||||
_ENDIF=]
|
||||
fixlist="${fixlist}
|
||||
[=hackname=]"
|
||||
if [ ! -r ${DESTDIR}/$file ]
|
||||
then infile=$file
|
||||
else infile=${DESTDIR}/$file ; fi [=
|
||||
|
||||
_IF sed _exist=][=
|
||||
_IF shell _exist =][=
|
||||
_ERROR hackname _get
|
||||
"fixincludes Error: %s fix has multiple fixups" _printf=][=
|
||||
_ENDIF=]
|
||||
|
||||
sed [=
|
||||
_FOR sed =]-e [=sed _shrstr=] \
|
||||
[=
|
||||
/sed=] < $infile > ${DESTDIR}/$file.[=
|
||||
|
||||
|
||||
_ELIF shell _exist =]
|
||||
( [=shell=] ) < $infile > ${DESTDIR}/$file.
|
||||
|
||||
# Shell scripts have the potential of removing the output
|
||||
# We interpret that to mean the file is not to be altered
|
||||
#
|
||||
if test ! -f ${DESTDIR}/$file.
|
||||
then continue ; fi [=
|
||||
|
||||
|
||||
_ELSE=][=
|
||||
_ERROR hackname _get "ERROR: %s has no fixup" _printf=][=
|
||||
|
||||
_ENDIF=]
|
||||
|
||||
mv -f ${DESTDIR}/$file. ${DESTDIR}/$file[=
|
||||
|
||||
# Close off any opened "if" or "case" statements in reverse order
|
||||
|
||||
# =][=
|
||||
|
||||
_IF select _exist test _exist | bypass _exist | =]
|
||||
fi # end of selection 'if'[=
|
||||
_ENDIF =][=
|
||||
|
||||
_IF mach _exist=]
|
||||
;; # case end for machine type test
|
||||
esac[=
|
||||
_ENDIF =][=
|
||||
|
||||
_IF files _exist=]
|
||||
;; # case end for file name test
|
||||
esac[=
|
||||
_ENDIF =][=
|
||||
|
||||
/fix =][=
|
||||
#
|
||||
# DONE with every fix for the current file
|
||||
#
|
||||
#=]
|
||||
# IF the output has been removed OR it is unchanged,
|
||||
# THEN ensure the output is gone
|
||||
# ELSE look for local directory include syntax
|
||||
#
|
||||
if ( test ! -f ${DESTDIR}/$file || \
|
||||
cmp $file ${DESTDIR}/$file ) > /dev/null 2>&1
|
||||
then
|
||||
rm -f ${DESTDIR}/$file
|
||||
else
|
||||
echo "Fixed $file:${fixlist}"
|
||||
|
||||
# Find any include directives that use "file".
|
||||
#
|
||||
for include in `
|
||||
egrep '^[ ]*#[ ]*include[ ]*"[^/]' ${DESTDIR}/$file |
|
||||
sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`
|
||||
do
|
||||
dir=`echo $file | sed -e s'|/[^/]*$||'`
|
||||
required="$required ${SRCDIR} $dir/$include ${DESTDIR}/$dir/$include"
|
||||
done
|
||||
fi
|
||||
done # for file in $files
|
2340
gcc/fixinc/inclhack.def
Normal file
2340
gcc/fixinc/inclhack.def
Normal file
File diff suppressed because it is too large
Load Diff
391
gcc/fixinc/inclhack.tpl
Normal file
391
gcc/fixinc/inclhack.tpl
Normal file
@ -0,0 +1,391 @@
|
||||
[= autogen template -*- Mode: ksh -*-
|
||||
sh
|
||||
#
|
||||
# $Id: inclhack.tpl,v 1.2 1998/12/16 21:19:11 law Exp $
|
||||
#
|
||||
=]
|
||||
#!/bin/sh
|
||||
#
|
||||
[= _EVAL "## " _DNE =]
|
||||
#
|
||||
# Install modified versions of certain ANSI-incompatible system header
|
||||
# files which are fixed to work correctly with ANSI C and placed in a
|
||||
# directory that GNU C will search.
|
||||
#
|
||||
# This script contains [=_eval fix _count =] fixup scripts.
|
||||
#
|
||||
# See README-fixinc for more information.
|
||||
#
|
||||
[=_eval fixincludes "## " _gpl=]
|
||||
#
|
||||
# # # # # # # # # # # # # # # # # # # # #
|
||||
#
|
||||
# Directory in which to store the results.
|
||||
# Fail if no arg to specify a directory for the output.
|
||||
if [ "x$1" = "x" ]
|
||||
then echo fixincludes: no output directory specified
|
||||
exit 1
|
||||
fi
|
||||
|
||||
LIB=${1}
|
||||
shift
|
||||
|
||||
# Make sure it exists.
|
||||
if [ ! -d $LIB ]; then
|
||||
mkdir $LIB || {
|
||||
echo fixincludes: output dir '`'$LIB"' cannot be created"
|
||||
exit 1
|
||||
}
|
||||
else
|
||||
( \cd $LIB && touch DONE && rm DONE ) || {
|
||||
echo fixincludes: output dir '`'$LIB"' is an invalid directory"
|
||||
exit 1
|
||||
}
|
||||
fi
|
||||
|
||||
# Define what target system we're fixing.
|
||||
#
|
||||
if test -r ./Makefile; then
|
||||
target_canonical="`sed -n -e 's,^target[ ]*=[ ]*\(.*\)$,\1,p' < Makefile`"
|
||||
fi
|
||||
|
||||
# If not from the Makefile, then try config.guess
|
||||
#
|
||||
if test -z "${target_canonical}" ; then
|
||||
if test -x ./config.guess ; then
|
||||
target_canonical="`config.guess`" ; fi
|
||||
test -z "${target_canonical}" && target_canonical=unknown
|
||||
fi
|
||||
export target_canonical
|
||||
|
||||
# # # # # # # # # # # # # # # # # # # # #
|
||||
#
|
||||
# Define PWDCMD as a command to use to get the working dir
|
||||
# in the form that we want.
|
||||
PWDCMD=pwd
|
||||
|
||||
case "`$PWDCMD`" in
|
||||
//*)
|
||||
# On an Apollo, discard everything before `/usr'.
|
||||
PWDCMD="eval pwd | sed -e 's,.*/usr/,/usr/,'"
|
||||
;;
|
||||
esac
|
||||
|
||||
# Original directory.
|
||||
ORIGDIR=`${PWDCMD}`[=
|
||||
_IF PROGRAM _env =]
|
||||
FIXINCL=${ORIGDIR}/fixincl
|
||||
export FIXINCL[=
|
||||
_ENDIF=]
|
||||
|
||||
# Make LIB absolute only if needed to avoid problems with the amd.
|
||||
case $LIB in
|
||||
/*)
|
||||
;;
|
||||
*)
|
||||
cd $LIB; LIB=`${PWDCMD}`
|
||||
;;
|
||||
esac
|
||||
|
||||
echo Fixing headers into ${LIB} for ${target_canonical} target
|
||||
|
||||
# Determine whether this system has symbolic links.
|
||||
if ln -s X $LIB/ShouldNotExist 2>/dev/null; then
|
||||
rm -f $LIB/ShouldNotExist
|
||||
LINKS=true
|
||||
elif ln -s X /tmp/ShouldNotExist 2>/dev/null; then
|
||||
rm -f /tmp/ShouldNotExist
|
||||
LINKS=true
|
||||
else
|
||||
LINKS=false
|
||||
fi
|
||||
|
||||
# # # # # # # # # # # # # # # # # # # # #
|
||||
#
|
||||
# Search each input directory for broken header files.
|
||||
# This loop ends near the end of the file.
|
||||
#
|
||||
if test $# -eq 0
|
||||
then
|
||||
INPUTLIST="/usr/include"
|
||||
else
|
||||
INPUTLIST="$@"
|
||||
fi
|
||||
|
||||
for INPUT in ${INPUTLIST} ; do
|
||||
|
||||
cd ${ORIGDIR}
|
||||
|
||||
cd ${INPUT} || {
|
||||
echo 'fixincludes: input dir `'$INPUT"' is an invalid directory"
|
||||
exit 1
|
||||
}
|
||||
|
||||
#
|
||||
# # # # # # # # # # # # # # # # # # # # #
|
||||
#
|
||||
echo Finding directories and links to directories
|
||||
|
||||
# Find all directories and all symlinks that point to directories.
|
||||
# Put the list in $files.
|
||||
# Each time we find a symlink, add it to newdirs
|
||||
# so that we do another find within the dir the link points to.
|
||||
# Note that $files may have duplicates in it;
|
||||
# later parts of this file are supposed to ignore them.
|
||||
dirs="."
|
||||
levels=2
|
||||
while [ -n "$dirs" ] && [ $levels -gt 0 ]
|
||||
do
|
||||
levels=`expr $levels - 1`
|
||||
newdirs=
|
||||
for d in $dirs
|
||||
do
|
||||
echo " Searching $INPUT/$d"
|
||||
|
||||
# Find all directories under $d, relative to $d, excluding $d itself.
|
||||
# (The /. is needed after $d in case $d is a symlink.)
|
||||
files="$files `find $d/. -type d -print | \
|
||||
sed -e '/\/\.$/d' -e 's@/./@/@g'`"
|
||||
# Find all links to directories.
|
||||
# Using `-exec test -d' in find fails on some systems,
|
||||
# and trying to run test via sh fails on others,
|
||||
# so this is the simplest alternative left.
|
||||
# First find all the links, then test each one.
|
||||
theselinks=
|
||||
$LINKS && \
|
||||
theselinks=`find $d/. -type l -print | sed -e 's@/./@/@g'`
|
||||
for d1 in $theselinks --dummy--
|
||||
do
|
||||
# If the link points to a directory,
|
||||
# add that dir to $newdirs
|
||||
if [ -d $d1 ]
|
||||
then
|
||||
files="$files $d1"
|
||||
if [ "`ls -ld $d1 | sed -n 's/.*-> //p'`" != "." ]
|
||||
then
|
||||
newdirs="$newdirs $d1"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
dirs="$newdirs"
|
||||
done
|
||||
|
||||
# # # # # # # # # # # # # # # # # # # # #
|
||||
#
|
||||
dirs=
|
||||
echo "All directories (including links to directories):"
|
||||
echo $files
|
||||
|
||||
for file in $files; do
|
||||
rm -rf $LIB/$file
|
||||
if [ ! -d $LIB/$file ]
|
||||
then mkdir $LIB/$file
|
||||
fi
|
||||
done
|
||||
mkdir $LIB/root
|
||||
|
||||
# # # # # # # # # # # # # # # # # # # # #
|
||||
#
|
||||
# treetops gets an alternating list
|
||||
# of old directories to copy
|
||||
# and the new directories to copy to.
|
||||
treetops="${INPUT} ${LIB}"
|
||||
|
||||
if $LINKS; then
|
||||
echo 'Making symbolic directory links'
|
||||
for file in $files; do
|
||||
dest=`ls -ld $file | sed -n 's/.*-> //p'`
|
||||
if [ "$dest" ]; then
|
||||
cwd=`${PWDCMD}`
|
||||
# In case $dest is relative, get to $file's dir first.
|
||||
cd ${INPUT}
|
||||
cd `echo ./$file | sed -n 's&[^/]*$&&p'`
|
||||
# Check that the target directory exists.
|
||||
# Redirections changed to avoid bug in sh on Ultrix.
|
||||
(cd $dest) > /dev/null 2>&1
|
||||
if [ $? = 0 ]; then
|
||||
cd $dest
|
||||
# X gets the dir that the link actually leads to.
|
||||
x=`${PWDCMD}`
|
||||
# Canonicalize ${INPUT} now to minimize the time an
|
||||
# automounter has to change the result of ${PWDCMD}.
|
||||
cinput=`cd ${INPUT}; ${PWDCMD}`
|
||||
# If a link points to ., make a similar link to .
|
||||
if [ $x = ${cinput} ]; then
|
||||
echo $file '->' . ': Making link'
|
||||
rm -fr ${LIB}/$file > /dev/null 2>&1
|
||||
ln -s . ${LIB}/$file > /dev/null 2>&1
|
||||
# If link leads back into ${INPUT},
|
||||
# make a similar link here.
|
||||
elif expr $x : "${cinput}/.*" > /dev/null; then
|
||||
# Y gets the actual target dir name, relative to ${INPUT}.
|
||||
y=`echo $x | sed -n "s&${cinput}/&&p"`
|
||||
# DOTS is the relative path from ${LIB}/$file's dir back to ${LIB}.
|
||||
dots=`echo "$file" |
|
||||
sed -e 's@^./@@' -e 's@/./@/@g' -e 's@[^/][^/]*@..@g' -e 's@..$@@'`
|
||||
echo $file '->' $dots$y ': Making link'
|
||||
rm -fr ${LIB}/$file > /dev/null 2>&1
|
||||
ln -s $dots$y ${LIB}/$file > /dev/null 2>&1
|
||||
else
|
||||
# If the link is to a dir $target outside ${INPUT},
|
||||
# repoint the link at ${INPUT}/root$target
|
||||
# and process $target into ${INPUT}/root$target
|
||||
# treat this directory as if it actually contained the files.
|
||||
echo $file '->' root$x ': Making link'
|
||||
if [ -d $LIB/root$x ]
|
||||
then true
|
||||
else
|
||||
dirname=root$x/
|
||||
dirmade=.
|
||||
cd $LIB
|
||||
while [ x$dirname != x ]; do
|
||||
component=`echo $dirname | sed -e 's|/.*$||'`
|
||||
mkdir $component >/dev/null 2>&1
|
||||
cd $component
|
||||
dirmade=$dirmade/$component
|
||||
dirname=`echo $dirname | sed -e 's|[^/]*/||'`
|
||||
done
|
||||
fi
|
||||
# Duplicate directory structure created in ${LIB}/$file in new
|
||||
# root area.
|
||||
for file2 in $files; do
|
||||
case $file2 in
|
||||
$file/*)
|
||||
dupdir=${LIB}/root$x/`echo $file2 | sed -n "s|^${file}/||p"`
|
||||
echo "Duplicating ${file}'s ${dupdir}"
|
||||
if [ -d ${dupdir} ]
|
||||
then true
|
||||
else
|
||||
mkdir ${dupdir}
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
done
|
||||
# Get the path from ${LIB} to $file, accounting for symlinks.
|
||||
parent=`echo "$file" | sed -e 's@/[^/]*$@@'`
|
||||
libabs=`cd ${LIB}; ${PWDCMD}`
|
||||
file2=`cd ${LIB}; cd $parent; ${PWDCMD} | sed -e "s@^${libabs}@@"`
|
||||
# DOTS is the relative path from ${LIB}/$file's dir back to ${LIB}.
|
||||
dots=`echo "$file2" | sed -e 's@/[^/]*@../@g'`
|
||||
rm -fr ${LIB}/$file > /dev/null 2>&1
|
||||
ln -s ${dots}root$x ${LIB}/$file > /dev/null 2>&1
|
||||
treetops="$treetops $x ${LIB}/root$x"
|
||||
fi
|
||||
fi
|
||||
cd $cwd
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# # # # # # # # # # # # # # # # # # # # #
|
||||
#
|
||||
required=
|
||||
set x $treetops
|
||||
shift
|
||||
while [ $# != 0 ]; do
|
||||
# $1 is an old directory to copy, and $2 is the new directory to copy to.
|
||||
#
|
||||
SRCDIR=`cd ${INPUT} ; cd $1 ; ${PWDCMD}`
|
||||
export SRCDIR
|
||||
shift
|
||||
|
||||
DESTDIR=`cd $1;${PWDCMD}`
|
||||
export DESTDIR
|
||||
shift
|
||||
|
||||
# The same dir can appear more than once in treetops.
|
||||
# There's no need to scan it more than once.
|
||||
#
|
||||
if [ -f ${DESTDIR}/DONE ]
|
||||
then continue ; fi
|
||||
|
||||
touch ${DESTDIR}/DONE
|
||||
echo Fixing directory ${SRCDIR} into ${DESTDIR}
|
||||
|
||||
# Check .h files which are symlinks as well as those which are files.
|
||||
# A link to a header file will not be processed by anything but this.
|
||||
#
|
||||
cd ${SRCDIR}
|
||||
[=_IF PROGRAM _env ! =][=
|
||||
|
||||
_include hackshell =][=
|
||||
|
||||
_ELSE
|
||||
|
||||
=]
|
||||
required="$required `if $LINKS; then
|
||||
find . -name '*.h' \( -type f -o -type l \) -print
|
||||
else
|
||||
find . -name '*.h' -type f -print
|
||||
fi | ${FIXINCL}`"[=
|
||||
|
||||
|
||||
_ENDIF =]
|
||||
done
|
||||
|
||||
## Make sure that any include files referenced using double quotes
|
||||
## exist in the fixed directory. This comes last since otherwise
|
||||
## we might end up deleting some of these files "because they don't
|
||||
## need any change."
|
||||
set x `echo $required`
|
||||
shift
|
||||
while [ $# != 0 ]; do
|
||||
newreq=
|
||||
while [ $# != 0 ]; do
|
||||
# $1 is the directory to copy from,
|
||||
# $2 is the unfixed file,
|
||||
# $3 is the fixed file name.
|
||||
#
|
||||
cd ${INPUT}
|
||||
cd $1
|
||||
if [ -r $2 ] && [ ! -r $3 ]; then
|
||||
cp $2 $3 >/dev/null 2>&1 || echo "Can't copy $2" >&2
|
||||
chmod +w $3 2>/dev/null
|
||||
chmod a+r $3 2>/dev/null
|
||||
echo Copied $2
|
||||
for include in `egrep '^[ ]*#[ ]*include[ ]*"[^/]' $3 |
|
||||
sed -e 's/^[ ]*#[ ]*include[ ]*"\([^"]*\)".*$/\1/'`
|
||||
do
|
||||
dir=`echo $2 | sed -e s'|/[^/]*$||'`
|
||||
dir2=`echo $3 | sed -e s'|/[^/]*$||'`
|
||||
newreq="$newreq $1 $dir/$include $dir2/$include"
|
||||
done
|
||||
fi
|
||||
shift; shift; shift
|
||||
done
|
||||
set x $newreq
|
||||
shift
|
||||
done
|
||||
|
||||
echo 'Cleaning up DONE files.'
|
||||
cd $LIB
|
||||
find . -name DONE -exec rm -f '{}' ';'
|
||||
|
||||
echo 'Removing unneeded directories:'
|
||||
cd $LIB
|
||||
files=`find . -type d -print | sort -r`
|
||||
for file in $files; do
|
||||
rmdir $LIB/$file > /dev/null 2>&1 | :
|
||||
done
|
||||
|
||||
# # # # # # # # # # # # # # # # # # # # #
|
||||
#
|
||||
# End of for INPUT directories
|
||||
#
|
||||
done
|
||||
#
|
||||
# # # # # # # # # # # # # # # # # # # # #
|
||||
|
||||
cd $ORIGDIR
|
||||
rm -f include/assert.h
|
||||
cp ${EGCS_SRCDIR}/assert.h include/assert.h
|
||||
chmod a+r include/assert.h
|
||||
[=
|
||||
|
||||
# Make the output file executable
|
||||
# =][=
|
||||
_eval _outfile "chmod +x %s" _printf _shell=]
|
116
gcc/fixinc/mkfixinc.sh
Executable file
116
gcc/fixinc/mkfixinc.sh
Executable file
@ -0,0 +1,116 @@
|
||||
#! /bin/sh
|
||||
|
||||
machine=$1
|
||||
if [ -z "$machine" ]
|
||||
then
|
||||
echo No machine name given
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo constructing fixinc.sh for $machine
|
||||
fixincludes="../fixinc.sh"
|
||||
|
||||
case $machine in
|
||||
*-*-gnu*)
|
||||
fixincludes=
|
||||
;;
|
||||
|
||||
*-*-sysv4*)
|
||||
fixincludes=fixinc.svr4
|
||||
;;
|
||||
|
||||
mips-dec-bsd*)
|
||||
:
|
||||
;;
|
||||
|
||||
i[34567]86-*-sysv5* | \
|
||||
i[34567]86-*-udk* | \
|
||||
i[34567]86-*-solaris2.[0-4] | \
|
||||
powerpcle-*-solaris2.[0-4] | \
|
||||
sparc-*-solaris2.[0-4] )
|
||||
fixincludes=fixinc.svr4
|
||||
;;
|
||||
|
||||
*-*-netbsd* | \
|
||||
alpha*-*-linux-gnulibc1* | \
|
||||
i[34567]86-*-freebsd* | \
|
||||
i[34567]86-*-netbsd* | i[34567]86-*-openbsd* | \
|
||||
i[34567]86-*-solaris2* | \
|
||||
sparcv9-*-solaris2* | \
|
||||
powerpcle-*-solaris2* | \
|
||||
sparc-*-solaris2* )
|
||||
fixincludes=fixinc.wrap
|
||||
;;
|
||||
|
||||
alpha*-*-winnt* | \
|
||||
i[34567]86-*-winnt3*)
|
||||
fixincludes=fixinc.winnt
|
||||
;;
|
||||
|
||||
i[34567]86-sequent-ptx* | i[34567]86-sequent-sysv[34]*)
|
||||
fixincludes=fixinc.ptx
|
||||
;;
|
||||
|
||||
i[34567]86-dg-dgux* | \
|
||||
m88k-dg-dgux*)
|
||||
fixincludes=fixinc.dgux
|
||||
;;
|
||||
|
||||
i[34567]86-*-sco3.2v5* | \
|
||||
i[34567]86-*-sco3.2v4*)
|
||||
fixincludes=fixinc.sco
|
||||
;;
|
||||
|
||||
alpha*-*-linux-gnu* | \
|
||||
alpha*-dec-vms* | \
|
||||
arm-semi-aout | armel-semi-aout | \
|
||||
arm-semi-aof | armel-semi-aof | \
|
||||
arm-*-linux-gnuaout* | \
|
||||
c*-convex-* | \
|
||||
hppa1.1-*-osf* | \
|
||||
hppa1.0-*-osf* | \
|
||||
hppa1.1-*-bsd* | \
|
||||
hppa1.0-*-bsd* | \
|
||||
hppa*-*-lites* | \
|
||||
*-*-linux-gnu* | \
|
||||
i[34567]86-moss-msdos* | i[34567]86-*-moss* | \
|
||||
i[34567]86-*-osf1* | \
|
||||
i[34567]86-*-win32 | \
|
||||
i[34567]86-*-pe | i[34567]86-*-cygwin32 | \
|
||||
i[34567]86-*-mingw32* | \
|
||||
mips-sgi-irix5cross64 | \
|
||||
powerpc-*-eabiaix* | \
|
||||
powerpc-*-eabisim* | \
|
||||
powerpc-*-eabi* | \
|
||||
powerpc-*-rtems* | \
|
||||
powerpcle-*-eabisim* | \
|
||||
powerpcle-*-eabi* | \
|
||||
powerpcle-*-winnt* | \
|
||||
powerpcle-*-pe | powerpcle-*-cygwin32 | \
|
||||
thumb-*-coff* | thumbel-*-coff* )
|
||||
fixincludes=
|
||||
;;
|
||||
|
||||
*-sgi-irix*)
|
||||
fixincludes=fixinc.irix
|
||||
;;
|
||||
esac
|
||||
|
||||
if test -z "$fixincludes"
|
||||
then
|
||||
cat > ../fixinc.sh <<- _EOF_
|
||||
#! /bin/sh
|
||||
exit 0
|
||||
_EOF_
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if test -f "$fixincludes"
|
||||
then
|
||||
echo copying $fixincludes to $dest
|
||||
cp $fixincludes $dest
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo $MAKE install
|
||||
$MAKE install || cp inclhack.sh ..
|
5058
gcc/fixinc/regex.c
Normal file
5058
gcc/fixinc/regex.c
Normal file
File diff suppressed because it is too large
Load Diff
503
gcc/fixinc/regex.h
Normal file
503
gcc/fixinc/regex.h
Normal file
@ -0,0 +1,503 @@
|
||||
/* Definitions for data structures and routines for the regular
|
||||
expression library, version 0.12.
|
||||
|
||||
Copyright (C) 1985, 1989, 1990, 1991, 1992, 1993 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., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
/* $Id: regex.h,v 1.3 1999/01/11 13:34:25 law Exp $ */
|
||||
|
||||
#ifndef __REGEXP_LIBRARY_H__
|
||||
#define __REGEXP_LIBRARY_H__
|
||||
|
||||
/* POSIX says that <sys/types.h> must be included (by the caller) before
|
||||
<regex.h>. */
|
||||
|
||||
#ifdef VMS
|
||||
/* VMS doesn't have `size_t' in <sys/types.h>, even though POSIX says it
|
||||
should be there. */
|
||||
#include <stddef.h>
|
||||
#endif
|
||||
|
||||
|
||||
/* The following bits are used to determine the regexp syntax we
|
||||
recognize. The set/not-set meanings are chosen so that Emacs syntax
|
||||
remains the value 0. The bits are given in alphabetical order, and
|
||||
the definitions shifted by one from the previous bit; thus, when we
|
||||
add or remove a bit, only one other definition need change. */
|
||||
typedef unsigned reg_syntax_t;
|
||||
|
||||
/* If this bit is not set, then \ inside a bracket expression is literal.
|
||||
If set, then such a \ quotes the following character. */
|
||||
#define RE_BACKSLASH_ESCAPE_IN_LISTS (1)
|
||||
|
||||
/* If this bit is not set, then + and ? are operators, and \+ and \? are
|
||||
literals.
|
||||
If set, then \+ and \? are operators and + and ? are literals. */
|
||||
#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1)
|
||||
|
||||
/* If this bit is set, then character classes are supported. They are:
|
||||
[:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:],
|
||||
[:space:], [:print:], [:punct:], [:graph:], and [:cntrl:].
|
||||
If not set, then character classes are not supported. */
|
||||
#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1)
|
||||
|
||||
/* If this bit is set, then ^ and $ are always anchors (outside bracket
|
||||
expressions, of course).
|
||||
If this bit is not set, then it depends:
|
||||
^ is an anchor if it is at the beginning of a regular
|
||||
expression or after an open-group or an alternation operator;
|
||||
$ is an anchor if it is at the end of a regular expression, or
|
||||
before a close-group or an alternation operator.
|
||||
|
||||
This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because
|
||||
POSIX draft 11.2 says that * etc. in leading positions is undefined.
|
||||
We already implemented a previous draft which made those constructs
|
||||
invalid, though, so we haven't changed the code back. */
|
||||
#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1)
|
||||
|
||||
/* If this bit is set, then special characters are always special
|
||||
regardless of where they are in the pattern.
|
||||
If this bit is not set, then special characters are special only in
|
||||
some contexts; otherwise they are ordinary. Specifically,
|
||||
* + ? and intervals are only special when not after the beginning,
|
||||
open-group, or alternation operator. */
|
||||
#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1)
|
||||
|
||||
/* If this bit is set, then *, +, ?, and { cannot be first in an re or
|
||||
immediately after an alternation or begin-group operator. */
|
||||
#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1)
|
||||
|
||||
/* If this bit is set, then . matches newline.
|
||||
If not set, then it doesn't. */
|
||||
#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1)
|
||||
|
||||
/* If this bit is set, then . doesn't match NUL.
|
||||
If not set, then it does. */
|
||||
#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1)
|
||||
|
||||
/* If this bit is set, nonmatching lists [^...] do not match newline.
|
||||
If not set, they do. */
|
||||
#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1)
|
||||
|
||||
/* If this bit is set, either \{...\} or {...} defines an
|
||||
interval, depending on RE_NO_BK_BRACES.
|
||||
If not set, \{, \}, {, and } are literals. */
|
||||
#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1)
|
||||
|
||||
/* If this bit is set, +, ? and | aren't recognized as operators.
|
||||
If not set, they are. */
|
||||
#define RE_LIMITED_OPS (RE_INTERVALS << 1)
|
||||
|
||||
/* If this bit is set, newline is an alternation operator.
|
||||
If not set, newline is literal. */
|
||||
#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1)
|
||||
|
||||
/* If this bit is set, then `{...}' defines an interval, and \{ and \}
|
||||
are literals.
|
||||
If not set, then `\{...\}' defines an interval. */
|
||||
#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1)
|
||||
|
||||
/* If this bit is set, (...) defines a group, and \( and \) are literals.
|
||||
If not set, \(...\) defines a group, and ( and ) are literals. */
|
||||
#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1)
|
||||
|
||||
/* If this bit is set, then \<digit> matches <digit>.
|
||||
If not set, then \<digit> is a back-reference. */
|
||||
#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1)
|
||||
|
||||
/* If this bit is set, then | is an alternation operator, and \| is literal.
|
||||
If not set, then \| is an alternation operator, and | is literal. */
|
||||
#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1)
|
||||
|
||||
/* If this bit is set, then an ending range point collating higher
|
||||
than the starting range point, as in [z-a], is invalid.
|
||||
If not set, then when ending range point collates higher than the
|
||||
starting range point, the range is ignored. */
|
||||
#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1)
|
||||
|
||||
/* If this bit is set, then an unmatched ) is ordinary.
|
||||
If not set, then an unmatched ) is invalid. */
|
||||
#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1)
|
||||
|
||||
/* This global variable defines the particular regexp syntax to use (for
|
||||
some interfaces). When a regexp is compiled, the syntax used is
|
||||
stored in the pattern buffer, so changing this does not affect
|
||||
already-compiled regexps. */
|
||||
extern reg_syntax_t re_syntax_options;
|
||||
|
||||
/* Define combinations of the above bits for the standard possibilities.
|
||||
(The [[[ comments delimit what gets put into the Texinfo file, so
|
||||
don't delete them!) */
|
||||
/* [[[begin syntaxes]]] */
|
||||
#define RE_SYNTAX_EMACS 0
|
||||
|
||||
#define RE_SYNTAX_AWK \
|
||||
(RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \
|
||||
| RE_NO_BK_PARENS | RE_NO_BK_REFS \
|
||||
| RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \
|
||||
| RE_UNMATCHED_RIGHT_PAREN_ORD)
|
||||
|
||||
#define RE_SYNTAX_POSIX_AWK \
|
||||
(RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS)
|
||||
|
||||
#define RE_SYNTAX_GREP \
|
||||
(RE_BK_PLUS_QM | RE_CHAR_CLASSES \
|
||||
| RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \
|
||||
| RE_NEWLINE_ALT)
|
||||
|
||||
#define RE_SYNTAX_EGREP \
|
||||
(RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \
|
||||
| RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \
|
||||
| RE_NEWLINE_ALT | RE_NO_BK_PARENS \
|
||||
| RE_NO_BK_VBAR)
|
||||
|
||||
#define RE_SYNTAX_POSIX_EGREP \
|
||||
(RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES)
|
||||
|
||||
/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */
|
||||
#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC
|
||||
|
||||
#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC
|
||||
|
||||
/* Syntax bits common to both basic and extended POSIX regex syntax. */
|
||||
#define _RE_SYNTAX_POSIX_COMMON \
|
||||
(RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \
|
||||
| RE_INTERVALS | RE_NO_EMPTY_RANGES)
|
||||
|
||||
#define RE_SYNTAX_POSIX_BASIC \
|
||||
(_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM)
|
||||
|
||||
/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes
|
||||
RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this
|
||||
isn't minimal, since other operators, such as \`, aren't disabled. */
|
||||
#define RE_SYNTAX_POSIX_MINIMAL_BASIC \
|
||||
(_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS)
|
||||
|
||||
#define RE_SYNTAX_POSIX_EXTENDED \
|
||||
(_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \
|
||||
| RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \
|
||||
| RE_NO_BK_PARENS | RE_NO_BK_VBAR \
|
||||
| RE_UNMATCHED_RIGHT_PAREN_ORD)
|
||||
|
||||
/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS
|
||||
replaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added. */
|
||||
#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \
|
||||
(_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \
|
||||
| RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \
|
||||
| RE_NO_BK_PARENS | RE_NO_BK_REFS \
|
||||
| RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD)
|
||||
/* [[[end syntaxes]]] */
|
||||
|
||||
/* Maximum number of duplicates an interval can allow. Some systems
|
||||
(erroneously) define this in other header files, but we want our
|
||||
value, so remove any previous define. */
|
||||
#ifdef RE_DUP_MAX
|
||||
#undef RE_DUP_MAX
|
||||
#endif
|
||||
#define RE_DUP_MAX ((1 << 15) - 1)
|
||||
|
||||
|
||||
/* POSIX `cflags' bits (i.e., information for `regcomp'). */
|
||||
|
||||
/* If this bit is set, then use extended regular expression syntax.
|
||||
If not set, then use basic regular expression syntax. */
|
||||
#define REG_EXTENDED 1
|
||||
|
||||
/* If this bit is set, then ignore case when matching.
|
||||
If not set, then case is significant. */
|
||||
#define REG_ICASE (REG_EXTENDED << 1)
|
||||
|
||||
/* If this bit is set, then anchors do not match at newline
|
||||
characters in the string.
|
||||
If not set, then anchors do match at newlines. */
|
||||
#define REG_NEWLINE (REG_ICASE << 1)
|
||||
|
||||
/* If this bit is set, then report only success or fail in regexec.
|
||||
If not set, then returns differ between not matching and errors. */
|
||||
#define REG_NOSUB (REG_NEWLINE << 1)
|
||||
|
||||
|
||||
/* POSIX `eflags' bits (i.e., information for regexec). */
|
||||
|
||||
/* If this bit is set, then the beginning-of-line operator doesn't match
|
||||
the beginning of the string (presumably because it's not the
|
||||
beginning of a line).
|
||||
If not set, then the beginning-of-line operator does match the
|
||||
beginning of the string. */
|
||||
#define REG_NOTBOL 1
|
||||
|
||||
/* Like REG_NOTBOL, except for the end-of-line. */
|
||||
#define REG_NOTEOL (1 << 1)
|
||||
|
||||
|
||||
/* POSIX doesn't require that we do anything for the 0 case,
|
||||
but why not be nice. */
|
||||
|
||||
#define REG_ERR_TABLE \
|
||||
_RERR_( NOERROR, "Success" ) \
|
||||
_RERR_( NOMATCH, "No match" ) \
|
||||
/* \
|
||||
* POSIX regcomp return error codes. \
|
||||
* (In the order listed in the standard.) \
|
||||
*/ \
|
||||
_RERR_( BADPAT, "Invalid regular expression" ) \
|
||||
_RERR_( ECOLLATE, "Invalid collation character" ) \
|
||||
_RERR_( ECTYPE, "Invalid character class name" ) \
|
||||
_RERR_( EESCAPE, "Trailing backslash" ) \
|
||||
_RERR_( ESUBREG, "Invalid back reference" ) \
|
||||
_RERR_( EBRACK, "Unmatched [ or [^" ) \
|
||||
_RERR_( EPAREN, "Unmatched ( or \\(" ) \
|
||||
_RERR_( EBRACE, "Unmatched \\{" ) \
|
||||
_RERR_( BADBR, "Invalid content of \\{\\}" ) \
|
||||
_RERR_( ERANGE, "Invalid range end" ) \
|
||||
_RERR_( ESPACE, "Memory exhausted" ) \
|
||||
_RERR_( BADRPT, "Invalid preceding regular expression" ) \
|
||||
_RERR_( ECHAR, "Invalid multibyte character" ) \
|
||||
_RERR_( EBOL, "^ anchor and not BOL" ) \
|
||||
_RERR_( EEOL, "$ anchor and not EOL" ) \
|
||||
\
|
||||
/* \
|
||||
* Error codes we've added. \
|
||||
*/ \
|
||||
_RERR_( EEND, "Premature end of regular expression" ) \
|
||||
_RERR_( ESIZE, "Regular expression too big" ) \
|
||||
_RERR_( ERPAREN, "Unmatched ) or \\)" )
|
||||
|
||||
#define _RERR_(n,t) REG_ ## n,
|
||||
|
||||
typedef enum { REG_ERR_TABLE REG_ERR_COUNT } reg_errcode_t;
|
||||
|
||||
#undef _RERR_
|
||||
|
||||
/* This data structure represents a compiled pattern. Before calling
|
||||
the pattern compiler, the fields `buffer', `allocated', `fastmap',
|
||||
`translate', and `no_sub' can be set. After the pattern has been
|
||||
compiled, the `re_nsub' field is available. All other fields are
|
||||
private to the regex routines. */
|
||||
|
||||
struct re_pattern_buffer
|
||||
{
|
||||
/* [[[begin pattern_buffer]]] */
|
||||
/* Space that holds the compiled pattern. It is declared as
|
||||
`unsigned char *' because its elements are
|
||||
sometimes used as array indexes. */
|
||||
unsigned char *buffer;
|
||||
|
||||
/* Number of bytes to which `buffer' points. */
|
||||
unsigned long allocated;
|
||||
|
||||
/* Number of bytes actually used in `buffer'. */
|
||||
unsigned long used;
|
||||
|
||||
/* Syntax setting with which the pattern was compiled. */
|
||||
reg_syntax_t syntax;
|
||||
|
||||
/* Pointer to a fastmap, if any, otherwise zero. re_search uses
|
||||
the fastmap, if there is one, to skip over impossible
|
||||
starting points for matches. */
|
||||
char *fastmap;
|
||||
|
||||
/* Either a translate table to apply to all characters before
|
||||
comparing them, or zero for no translation. The translation
|
||||
is applied to a pattern when it is compiled and to a string
|
||||
when it is matched. */
|
||||
char *translate;
|
||||
|
||||
/* Number of subexpressions found by the compiler. */
|
||||
size_t re_nsub;
|
||||
|
||||
/* Zero if this pattern cannot match the empty string, one else.
|
||||
Well, in truth it's used only in `re_search_2', to see
|
||||
whether or not we should use the fastmap, so we don't set
|
||||
this absolutely perfectly; see `re_compile_fastmap' (the
|
||||
`duplicate' case). */
|
||||
unsigned can_be_null : 1;
|
||||
|
||||
/* If REGS_UNALLOCATED, allocate space in the `regs' structure
|
||||
for `max (RE_NREGS, re_nsub + 1)' groups.
|
||||
If REGS_REALLOCATE, reallocate space if necessary.
|
||||
If REGS_FIXED, use what's there. */
|
||||
#define REGS_UNALLOCATED 0
|
||||
#define REGS_REALLOCATE 1
|
||||
#define REGS_FIXED 2
|
||||
unsigned regs_allocated : 2;
|
||||
|
||||
/* Set to zero when `regex_compile' compiles a pattern; set to one
|
||||
by `re_compile_fastmap' if it updates the fastmap. */
|
||||
unsigned fastmap_accurate : 1;
|
||||
|
||||
/* If set, `re_match_2' does not return information about
|
||||
subexpressions. */
|
||||
unsigned no_sub : 1;
|
||||
|
||||
/* If set, a beginning-of-line anchor doesn't match at the
|
||||
beginning of the string. */
|
||||
unsigned not_bol : 1;
|
||||
|
||||
/* Similarly for an end-of-line anchor. */
|
||||
unsigned not_eol : 1;
|
||||
|
||||
/* If true, an anchor at a newline matches. */
|
||||
unsigned newline_anchor : 1;
|
||||
|
||||
/* [[[end pattern_buffer]]] */
|
||||
};
|
||||
|
||||
typedef struct re_pattern_buffer regex_t;
|
||||
|
||||
|
||||
/* search.c (search_buffer) in Emacs needs this one opcode value. It is
|
||||
defined both in `regex.c' and here. */
|
||||
#define RE_EXACTN_VALUE 1
|
||||
|
||||
/* Type for byte offsets within the string. POSIX mandates this. */
|
||||
typedef int regoff_t;
|
||||
|
||||
|
||||
/* This is the structure we store register match data in. See
|
||||
regex.texinfo for a full description of what registers match. */
|
||||
struct re_registers
|
||||
{
|
||||
unsigned num_regs;
|
||||
regoff_t *start;
|
||||
regoff_t *end;
|
||||
};
|
||||
|
||||
|
||||
/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer,
|
||||
`re_match_2' returns information about at least this many registers
|
||||
the first time a `regs' structure is passed. */
|
||||
#ifndef RE_NREGS
|
||||
#define RE_NREGS 30
|
||||
#endif
|
||||
|
||||
|
||||
/* POSIX specification for registers. Aside from the different names than
|
||||
`re_registers', POSIX uses an array of structures, instead of a
|
||||
structure of arrays. */
|
||||
typedef struct
|
||||
{
|
||||
regoff_t rm_so; /* Byte offset from string's start to substring's start. */
|
||||
regoff_t rm_eo; /* Byte offset from string's start to substring's end. */
|
||||
} regmatch_t;
|
||||
|
||||
/* Declarations for routines. */
|
||||
|
||||
/* To avoid duplicating every routine declaration -- once with a
|
||||
prototype (if we are ANSI), and once without (if we aren't) -- we
|
||||
use the following macro to declare argument types. This
|
||||
unfortunately clutters up the declarations a bit, but I think it's
|
||||
worth it. */
|
||||
|
||||
#if __STDC__
|
||||
|
||||
#define _RE_ARGS(args) args
|
||||
|
||||
#else /* not __STDC__ */
|
||||
|
||||
#define _RE_ARGS(args) ()
|
||||
|
||||
#endif /* not __STDC__ */
|
||||
|
||||
/* Sets the current default syntax to SYNTAX, and return the old syntax.
|
||||
You can also simply assign to the `re_syntax_options' variable. */
|
||||
extern reg_syntax_t re_set_syntax _RE_ARGS ((reg_syntax_t syntax));
|
||||
|
||||
/* Compile the regular expression PATTERN, with length LENGTH
|
||||
and syntax given by the global `re_syntax_options', into the buffer
|
||||
BUFFER. Return NULL if successful, and an error string if not. */
|
||||
extern const char *re_compile_pattern
|
||||
_RE_ARGS ((const char *pattern, int length,
|
||||
struct re_pattern_buffer *buffer));
|
||||
|
||||
|
||||
/* Compile a fastmap for the compiled pattern in BUFFER; used to
|
||||
accelerate searches. Return 0 if successful and -2 if was an
|
||||
internal error. */
|
||||
extern int re_compile_fastmap _RE_ARGS ((struct re_pattern_buffer *buffer));
|
||||
|
||||
|
||||
/* Search in the string STRING (with length LENGTH) for the pattern
|
||||
compiled into BUFFER. Start searching at position START, for RANGE
|
||||
characters. Return the starting position of the match, -1 for no
|
||||
match, or -2 for an internal error. Also return register
|
||||
information in REGS (if REGS and BUFFER->no_sub are nonzero). */
|
||||
extern int re_search
|
||||
_RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
|
||||
int length, int start, int range, struct re_registers *regs));
|
||||
|
||||
|
||||
/* Like `re_search', but search in the concatenation of STRING1 and
|
||||
STRING2. Also, stop searching at index START + STOP. */
|
||||
extern int re_search_2
|
||||
_RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
|
||||
int length1, const char *string2, int length2,
|
||||
int start, int range, struct re_registers *regs, int stop));
|
||||
|
||||
|
||||
/* Like `re_search', but return how many characters in STRING the regexp
|
||||
in BUFFER matched, starting at position START. */
|
||||
extern int re_match
|
||||
_RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
|
||||
int length, int start, struct re_registers *regs));
|
||||
|
||||
|
||||
/* Relates to `re_match' as `re_search_2' relates to `re_search'. */
|
||||
extern int re_match_2
|
||||
_RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
|
||||
int length1, const char *string2, int length2,
|
||||
int start, struct re_registers *regs, int stop));
|
||||
|
||||
|
||||
/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
|
||||
ENDS. Subsequent matches using BUFFER and REGS will use this memory
|
||||
for recording register information. STARTS and ENDS must be
|
||||
allocated with malloc, and must each be at least `NUM_REGS * sizeof
|
||||
(regoff_t)' bytes long.
|
||||
|
||||
If NUM_REGS == 0, then subsequent matches should allocate their own
|
||||
register data.
|
||||
|
||||
Unless this function is called, the first search or match using
|
||||
PATTERN_BUFFER will allocate its own register data, without
|
||||
freeing the old data. */
|
||||
extern void re_set_registers
|
||||
_RE_ARGS ((struct re_pattern_buffer *buffer, struct re_registers *regs,
|
||||
unsigned num_regs, regoff_t *starts, regoff_t *ends));
|
||||
|
||||
/* 4.2 bsd compatibility. */
|
||||
extern char *re_comp _RE_ARGS ((const char *));
|
||||
extern int re_exec _RE_ARGS ((const char *));
|
||||
|
||||
/* POSIX compatibility. */
|
||||
extern int regcomp _RE_ARGS ((regex_t *preg, const char *pattern, int cflags));
|
||||
extern int regexec
|
||||
_RE_ARGS ((const regex_t *preg, const char *string, size_t nmatch,
|
||||
regmatch_t pmatch[], int eflags));
|
||||
extern size_t regerror
|
||||
_RE_ARGS ((int errcode, const regex_t *preg, char *errbuf,
|
||||
size_t errbuf_size));
|
||||
extern void regfree _RE_ARGS ((regex_t *preg));
|
||||
|
||||
#endif /* not __REGEXP_LIBRARY_H__ */
|
||||
|
||||
/*
|
||||
Local variables:
|
||||
make-backup-files: t
|
||||
version-control: t
|
||||
trim-versions-without-asking: nil
|
||||
End:
|
||||
*/
|
464
gcc/fixinc/server.c
Normal file
464
gcc/fixinc/server.c
Normal file
@ -0,0 +1,464 @@
|
||||
|
||||
/*
|
||||
* $Id: server.c,v 1.2 1998/12/16 21:19:16 law Exp $
|
||||
*
|
||||
* Server Handling copyright 1992-1998 Bruce Korb
|
||||
*
|
||||
* Server Handling is free software.
|
||||
* You may 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.
|
||||
*
|
||||
* Server Handling 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 Server Handling. See the file "COPYING". If not,
|
||||
* write to: The Free Software Foundation, Inc.,
|
||||
* 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* As a special exception, Bruce Korb gives permission for additional
|
||||
* uses of the text contained in his release of ServerHandler.
|
||||
*
|
||||
* The exception is that, if you link the ServerHandler library with other
|
||||
* files to produce an executable, this does not by itself cause the
|
||||
* resulting executable to be covered by the GNU General Public License.
|
||||
* Your use of that executable is in no way restricted on account of
|
||||
* linking the ServerHandler library code into it.
|
||||
*
|
||||
* This exception does not however invalidate any other reasons why
|
||||
* the executable file might be covered by the GNU General Public License.
|
||||
*
|
||||
* This exception applies only to the code released by Bruce Korb under
|
||||
* the name ServerHandler. If you copy code from other sources under the
|
||||
* General Public License into a copy of ServerHandler, as the General Public
|
||||
* License permits, the exception does not apply to the code that you add
|
||||
* in this way. To avoid misleading anyone as to the status of such
|
||||
* modified files, you must delete this exception notice from them.
|
||||
*
|
||||
* If you write modifications of your own for ServerHandler, it is your
|
||||
* choice whether to permit this exception to apply to your modifications.
|
||||
* If you do not wish that, delete this exception notice.
|
||||
*/
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <sys/param.h>
|
||||
|
||||
#include "server.h"
|
||||
|
||||
#ifdef DEBUG
|
||||
#define STATIC
|
||||
#else
|
||||
#define STATIC static
|
||||
#endif
|
||||
#ifndef tSCC
|
||||
#define tSCC static const char
|
||||
#endif
|
||||
#ifndef NUL
|
||||
#define NUL '\0'
|
||||
#endif
|
||||
|
||||
STATIC bool readPipeTimeout;
|
||||
|
||||
STATIC tpChar defArgs[] =
|
||||
{(char *) NULL, "-p", (char *) NULL};
|
||||
STATIC tpfPair serverPair =
|
||||
{(FILE *) NULL, (FILE *) NULL};
|
||||
STATIC pid_t serverId = NULLPROCESS;
|
||||
/*
|
||||
* Arbitrary text that should not be found in the shell output.
|
||||
* It must be a single line and appear verbatim at the start of
|
||||
* the terminating output line.
|
||||
*/
|
||||
tSCC zDone[] = "ShElL-OuTpUt-HaS-bEeN-cOmPlEtEd";
|
||||
STATIC tpChar pCurDir = (char *) NULL;
|
||||
|
||||
/*
|
||||
* chainOpen
|
||||
*
|
||||
* Given an FD for an inferior process to use as stdin,
|
||||
* start that process and return a NEW FD that that process
|
||||
* will use for its stdout. Requires the argument vector
|
||||
* for the new process and, optionally, a pointer to a place
|
||||
* to store the child's process id.
|
||||
*/
|
||||
int
|
||||
chainOpen (stdinFd, ppArgs, pChild)
|
||||
int stdinFd;
|
||||
tpChar *ppArgs;
|
||||
pid_t *pChild;
|
||||
{
|
||||
tFdPair stdoutPair =
|
||||
{-1, -1};
|
||||
pid_t chId;
|
||||
char *pzCmd;
|
||||
|
||||
/*
|
||||
* Create a pipe it will be the child process' stdout,
|
||||
* and the parent will read from it.
|
||||
*/
|
||||
if ((pipe ((int *) &stdoutPair) < 0))
|
||||
{
|
||||
if (pChild != (pid_t *) NULL)
|
||||
*pChild = NOPROCESS;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we did not get an arg list, use the default
|
||||
*/
|
||||
if (ppArgs == (tpChar *) NULL)
|
||||
ppArgs = defArgs;
|
||||
|
||||
/*
|
||||
* If the arg list does not have a program,
|
||||
* assume the "SHELL" from the environment, or, failing
|
||||
* that, then sh. Set argv[0] to whatever we decided on.
|
||||
*/
|
||||
if (pzCmd = *ppArgs,
|
||||
(pzCmd == (char *) NULL) || (*pzCmd == '\0'))
|
||||
{
|
||||
|
||||
pzCmd = getenv ("SHELL");
|
||||
if (pzCmd == (char *) NULL)
|
||||
pzCmd = "sh";
|
||||
}
|
||||
#ifdef DEBUG_PRINT
|
||||
printf ("START: %s\n", pzCmd);
|
||||
{
|
||||
int idx = 0;
|
||||
while (ppArgs[++idx] != (char *) NULL)
|
||||
printf (" ARG %2d: %s\n", idx, ppArgs[idx]);
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
* Call fork() and see which process we become
|
||||
*/
|
||||
chId = fork ();
|
||||
switch (chId)
|
||||
{
|
||||
case NOPROCESS: /* parent - error in call */
|
||||
close (stdoutPair.readFd);
|
||||
close (stdoutPair.writeFd);
|
||||
if (pChild != (pid_t *) NULL)
|
||||
*pChild = NOPROCESS;
|
||||
return -1;
|
||||
|
||||
default: /* parent - return opposite FD's */
|
||||
if (pChild != (pid_t *) NULL)
|
||||
*pChild = chId;
|
||||
#ifdef DEBUG_PRINT
|
||||
printf ("for pid %d: stdin from %d, stdout to %d\n"
|
||||
"for parent: read from %d\n",
|
||||
chId, stdinFd, stdoutPair.writeFd, stdoutPair.readFd);
|
||||
#endif
|
||||
close (stdinFd);
|
||||
close (stdoutPair.writeFd);
|
||||
return stdoutPair.readFd;
|
||||
|
||||
case NULLPROCESS: /* child - continue processing */
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Close the pipe end handed back to the parent process
|
||||
*/
|
||||
close (stdoutPair.readFd);
|
||||
|
||||
/*
|
||||
* Close our current stdin and stdout
|
||||
*/
|
||||
close (STDIN_FILENO);
|
||||
close (STDOUT_FILENO);
|
||||
|
||||
/*
|
||||
* Make the fd passed in the stdin, and the write end of
|
||||
* the new pipe become the stdout.
|
||||
*/
|
||||
fcntl (stdoutPair.writeFd, F_DUPFD, STDOUT_FILENO);
|
||||
fcntl (stdinFd, F_DUPFD, STDIN_FILENO);
|
||||
|
||||
if (*ppArgs == (char *) NULL)
|
||||
*ppArgs = pzCmd;
|
||||
|
||||
execvp (pzCmd, ppArgs);
|
||||
fprintf (stderr, "Error %d: Could not execvp( '%s', ... ): %s\n",
|
||||
errno, pzCmd, strerror (errno));
|
||||
exit (EXIT_PANIC);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* p2open
|
||||
*
|
||||
* Given a pointer to an argument vector, start a process and
|
||||
* place its stdin and stdout file descriptors into an fd pair
|
||||
* structure. The "writeFd" connects to the inferior process
|
||||
* stdin, and the "readFd" connects to its stdout. The calling
|
||||
* process should write to "writeFd" and read from "readFd".
|
||||
* The return value is the process id of the created process.
|
||||
*/
|
||||
pid_t
|
||||
p2open (pPair, ppArgs)
|
||||
tFdPair *pPair;
|
||||
tpChar *ppArgs;
|
||||
{
|
||||
pid_t chId;
|
||||
|
||||
/*
|
||||
* Create a bi-directional pipe. Writes on 0 arrive on 1
|
||||
* and vice versa, so the parent and child processes will
|
||||
* read and write to opposite FD's.
|
||||
*/
|
||||
if (pipe ((int *) pPair) < 0)
|
||||
return NOPROCESS;
|
||||
|
||||
pPair->readFd = chainOpen (pPair->readFd, ppArgs, &chId);
|
||||
if (chId == NOPROCESS)
|
||||
close (pPair->writeFd);
|
||||
|
||||
return chId;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* p2fopen
|
||||
*
|
||||
* Identical to "p2open()", except that the "fd"'s are "fdopen(3)"-ed
|
||||
* into file pointers instead.
|
||||
*/
|
||||
pid_t
|
||||
p2fopen (pfPair, ppArgs)
|
||||
tpfPair *pfPair;
|
||||
tpChar *ppArgs;
|
||||
{
|
||||
tFdPair fdPair;
|
||||
pid_t chId = p2open (&fdPair, ppArgs);
|
||||
|
||||
if (chId == NOPROCESS)
|
||||
return chId;
|
||||
|
||||
pfPair->pfRead = fdopen (fdPair.readFd, "r");
|
||||
pfPair->pfWrite = fdopen (fdPair.writeFd, "w");
|
||||
return chId;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* loadData
|
||||
*
|
||||
* Read data from a file pointer (a pipe to a process in this context)
|
||||
* until we either get EOF or we get a marker line back.
|
||||
* The read data are stored in a malloc-ed string that is truncated
|
||||
* to size at the end. Input is assumed to be an ASCII string.
|
||||
*/
|
||||
STATIC char *
|
||||
loadData (fp)
|
||||
FILE *fp;
|
||||
{
|
||||
char *pzText;
|
||||
size_t textSize;
|
||||
char *pzScan;
|
||||
char zLine[1024];
|
||||
|
||||
textSize = sizeof (zLine) * 2;
|
||||
pzScan = \
|
||||
pzText = malloc (textSize);
|
||||
|
||||
if (pzText == (char *) NULL)
|
||||
return pzText;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
size_t usedCt;
|
||||
|
||||
alarm (10);
|
||||
readPipeTimeout = BOOL_FALSE;
|
||||
if (fgets (zLine, sizeof (zLine), fp) == (char *) NULL)
|
||||
break;
|
||||
|
||||
if (strncmp (zLine, zDone, sizeof (zDone) - 1) == 0)
|
||||
break;
|
||||
|
||||
strcpy (pzScan, zLine);
|
||||
pzScan += strlen (zLine);
|
||||
usedCt = (size_t) (pzScan - pzText);
|
||||
|
||||
if (textSize - usedCt < sizeof (zLine))
|
||||
{
|
||||
|
||||
size_t off = (size_t) (pzScan - pzText);
|
||||
void *p;
|
||||
textSize += 4096;
|
||||
p = realloc ((void *) pzText, textSize);
|
||||
if (p == (void *) NULL)
|
||||
{
|
||||
fprintf (stderr, "Failed to get 0x%08X bytes\n", textSize);
|
||||
free ((void *) pzText);
|
||||
return (char *) NULL;
|
||||
}
|
||||
|
||||
pzText = (char *) p;
|
||||
pzScan = pzText + off;
|
||||
}
|
||||
}
|
||||
|
||||
alarm (0);
|
||||
if (readPipeTimeout)
|
||||
{
|
||||
free ((void *) pzText);
|
||||
return (char *) NULL;
|
||||
}
|
||||
|
||||
while ((pzScan > pzText) && isspace (pzScan[-1]))
|
||||
pzScan--;
|
||||
*pzScan = NUL;
|
||||
return realloc ((void *) pzText, strlen (pzText) + 1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* SHELL SERVER PROCESS CODE
|
||||
*/
|
||||
|
||||
#ifdef DONT_HAVE_SIGSEND
|
||||
typedef enum
|
||||
{
|
||||
P_ALL, P_PID, P_GID, P_UID, P_PGID, P_SID, P_CID
|
||||
}
|
||||
idtype_t;
|
||||
typedef long id_t;
|
||||
|
||||
STATIC int
|
||||
sigsend (idtype, id, sig)
|
||||
idtype_t idtype;
|
||||
id_t id;
|
||||
int sig;
|
||||
{
|
||||
switch (idtype)
|
||||
{
|
||||
case P_PID:
|
||||
kill ((pid_t) id, sig);
|
||||
break;
|
||||
|
||||
case P_ALL:
|
||||
case P_GID:
|
||||
case P_UID:
|
||||
case P_PGID:
|
||||
case P_SID:
|
||||
case P_CID:
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
/*NOTREACHED */
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* HAVE_SIGSEND */
|
||||
|
||||
|
||||
STATIC void
|
||||
closeServer ()
|
||||
{
|
||||
kill( (pid_t) serverId, SIGKILL);
|
||||
serverId = NULLPROCESS;
|
||||
fclose (serverPair.pfRead);
|
||||
fclose (serverPair.pfWrite);
|
||||
serverPair.pfRead = serverPair.pfWrite = (FILE *) NULL;
|
||||
}
|
||||
|
||||
|
||||
struct sigaction savePipeAction;
|
||||
struct sigaction saveAlrmAction;
|
||||
struct sigaction currentAction;
|
||||
|
||||
STATIC void
|
||||
sigHandler (signo)
|
||||
int signo;
|
||||
{
|
||||
closeServer ();
|
||||
readPipeTimeout = BOOL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
STATIC void
|
||||
serverSetup ()
|
||||
{
|
||||
#ifndef SA_SIGINFO
|
||||
# define SA_SIGINFO 0
|
||||
#else
|
||||
currentAction.sa_sigaction =
|
||||
#endif
|
||||
currentAction.sa_handler = sigHandler;
|
||||
currentAction.sa_flags = SA_SIGINFO;
|
||||
sigemptyset( ¤tAction.sa_mask );
|
||||
|
||||
sigaction( SIGPIPE, ¤tAction, &savePipeAction );
|
||||
sigaction( SIGALRM, ¤tAction, &saveAlrmAction );
|
||||
atexit( &closeServer );
|
||||
|
||||
fputs ("trap : INT\n", serverPair.pfWrite);
|
||||
fflush (serverPair.pfWrite);
|
||||
pCurDir = getcwd ((char *) NULL, MAXPATHLEN + 1);
|
||||
}
|
||||
|
||||
|
||||
char *
|
||||
runShell (pzCmd)
|
||||
const char *pzCmd;
|
||||
{
|
||||
tSCC zNil[] = "";
|
||||
|
||||
/*
|
||||
* IF the shell server process is not running yet,
|
||||
* THEN try to start it.
|
||||
*/
|
||||
if (serverId == NULLPROCESS)
|
||||
{
|
||||
serverId = p2fopen (&serverPair, defArgs);
|
||||
if (serverId > 0)
|
||||
serverSetup ();
|
||||
}
|
||||
|
||||
/*
|
||||
* IF it is still not running,
|
||||
* THEN return the nil string.
|
||||
*/
|
||||
if (serverId <= 0)
|
||||
return (char *) zNil;
|
||||
|
||||
/*
|
||||
* Make sure the process will pay attention to us,
|
||||
* send the supplied command, and then
|
||||
* have it output a special marker that we can find.
|
||||
*/
|
||||
fprintf (serverPair.pfWrite, "\\cd %s\n%s\n\necho\necho %s\n",
|
||||
pCurDir, pzCmd, zDone);
|
||||
fflush (serverPair.pfWrite);
|
||||
if (serverId == NULLPROCESS)
|
||||
return (char *) NULL;
|
||||
|
||||
/*
|
||||
* Now try to read back all the data. If we fail due to either
|
||||
* a sigpipe or sigalrm (timeout), we will return the nil string.
|
||||
*/
|
||||
{
|
||||
char *pz = loadData (serverPair.pfRead);
|
||||
if (pz == (char *) NULL)
|
||||
{
|
||||
fprintf (stderr, "CLOSING SHELL SERVER - command failure:\n\t%s\n",
|
||||
pzCmd);
|
||||
closeServer ();
|
||||
pz = (char *) zNil;
|
||||
}
|
||||
return pz;
|
||||
}
|
||||
}
|
94
gcc/fixinc/server.h
Normal file
94
gcc/fixinc/server.h
Normal file
@ -0,0 +1,94 @@
|
||||
|
||||
/*
|
||||
* $Id: server.h,v 1.2 1998/12/16 21:19:17 law Exp $
|
||||
*
|
||||
* Server Handling copyright 1992-1998 Bruce Korb
|
||||
*
|
||||
* Server Handling is free software.
|
||||
* You may 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.
|
||||
*
|
||||
* Server Handling 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 Server Handling. See the file "COPYING". If not,
|
||||
* write to: The Free Software Foundation, Inc.,
|
||||
* 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* As a special exception, Bruce Korb gives permission for additional
|
||||
* uses of the text contained in his release of ServerHandler.
|
||||
*
|
||||
* The exception is that, if you link the ServerHandler library with other
|
||||
* files to produce an executable, this does not by itself cause the
|
||||
* resulting executable to be covered by the GNU General Public License.
|
||||
* Your use of that executable is in no way restricted on account of
|
||||
* linking the ServerHandler library code into it.
|
||||
*
|
||||
* This exception does not however invalidate any other reasons why
|
||||
* the executable file might be covered by the GNU General Public License.
|
||||
*
|
||||
* This exception applies only to the code released by Bruce Korb under
|
||||
* the name ServerHandler. If you copy code from other sources under the
|
||||
* General Public License into a copy of ServerHandler, as the General Public
|
||||
* License permits, the exception does not apply to the code that you add
|
||||
* in this way. To avoid misleading anyone as to the status of such
|
||||
* modified files, you must delete this exception notice from them.
|
||||
*
|
||||
* If you write modifications of your own for ServerHandler, it is your
|
||||
* choice whether to permit this exception to apply to your modifications.
|
||||
* If you do not wish that, delete this exception notice.
|
||||
*/
|
||||
|
||||
#ifndef FIXINC_SERVER_H
|
||||
#define FIXINC_SERVER_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/*
|
||||
* Dual pipe opening of a child process
|
||||
*/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int readFd;
|
||||
int writeFd;
|
||||
}
|
||||
tFdPair;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
FILE *pfRead; /* parent read fp */
|
||||
FILE *pfWrite; /* parent write fp */
|
||||
}
|
||||
tpfPair;
|
||||
|
||||
typedef char *tpChar;
|
||||
|
||||
#define NOPROCESS ((pid_t)-1)
|
||||
#define NULLPROCESS ((pid_t)0)
|
||||
|
||||
#define EXIT_PANIC 99
|
||||
|
||||
typedef enum
|
||||
{
|
||||
BOOL_FALSE, BOOL_TRUE
|
||||
}
|
||||
bool;
|
||||
|
||||
#define _P_(p) ()
|
||||
|
||||
char *runShell _P_ ((const char *pzCmd));
|
||||
pid_t p2fopen _P_ ((tpfPair * pfPair, tpChar * ppArgs));
|
||||
pid_t p2open _P_ ((tFdPair * pPair, tpChar * ppArgs));
|
||||
int
|
||||
chainOpen _P_ ((int stdinFd,
|
||||
tpChar * ppArgs,
|
||||
pid_t * pChild));
|
||||
|
||||
#endif /* FIXINC_SERVER_H */
|
Loading…
Reference in New Issue
Block a user