Commit 0083c904 by Bruce Korb

These files are being moved from the contrib/fixinc directory.

They have been modified somewhat to work in the new environment.

From-SVN: r23125
parent 162bc98d
# 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
#!/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
#! /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
#! /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
#! /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
#! /bin/sh
# Install modified versions of certain ANSI-incompatible
# native System V Release 4 system include files.
# Copyright (C) 1994, 1996, 1997 Free Software Foundation, Inc.
# Contributed by Ron Guilmette (rfg@monkeys.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.
#
# This script munges the native include files provided with System V
# Release 4 systems so as to remove things which are violations of the
# ANSI C standard. 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
# System V Release 4 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 '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=`find . -follow -type d -print 2>/dev/null | sed '/^.$/d'`
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'`
rwd=`pwd`
# 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 "$dest" : '[^/][^/]*' >/dev/null && [ ! -h $dest ]; then
echo $file '->' $dest': Making link'
rm -fr ${LIB}/$file > /dev/null 2>&1
ln -s $dest ${LIB}/$file > /dev/null 2>&1
elif 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
elif expr $x : "${rwd}/.*" > /dev/null; then
# Y gets the actual target dir name, relative to the directory where the link is.
y=`echo $x | sed -n "s&${rwd}/&&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
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 [ -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
# This code makes Solaris SCSI fail, because it changes the
# alignment within some critical structures. See <sys/scsi/impl/commands.h>.
# s/u_char\([ ][ ]*[a-zA-Z0-9_][a-zA-Z0-9_]*[ ]*:[ ]*[0-9][0-9]*\)/u_int\1/
# Disable these also, since they probably aren't safe either.
# s/u_short\([ ][ ]*[a-zA-Z0-9_][a-zA-Z0-9_]*[ ]*:[ ]*[0-9][0-9]*\)/u_int\1/
# s/ushort\([ ][ ]*[a-zA-Z0-9_][a-zA-Z0-9_]*[ ]*:[ ]*[0-9][0-9]*\)/u_int\1/
# s/evcm_t\([ ][ ]*[a-zA-Z0-9_][a-zA-Z0-9_]*[ ]*:[ ]*[0-9][0-9]*\)/u_int\1/
# s/Pbyte\([ ][ ]*[a-zA-Z0-9_][a-zA-Z0-9_]*[ ]*:[ ]*SEQSIZ\)/unsigned int\1/
# The change of u_char, etc, to u_int
# applies to bit fields.
sed -e '
s%^\([ ]*#[ ]*else\)[ ]*/[^*].*%\1%
s%^\([ ]*#[ ]*else\)[ ]*[^/ ].*%\1%
s%^\([ ]*#[ ]*endif\)[ ]*/[^*].*%\1%
s%^\([ ]*#[ ]*endif\)[ ]*[^/ ].*%\1%
s/#lint(on)/defined(lint)/g
s/#lint(off)/!defined(lint)/g
s/#machine(\([^)]*\))/defined(__\1__)/g
s/#system(\([^)]*\))/defined(__\1__)/g
s/#cpu(\([^)]*\))/defined(__\1__)/g
/#[a-z]*if.*[ (]m68k/ s/\([^_]\)m68k/\1__m68k__/g
/#[a-z]*if.*[ (]__i386\([^_]\)/ s/__i386/__i386__/g
/#[a-z]*if.*[ (]i386/ s/\([^_]\)i386/\1__i386__/g
/#[a-z]*if.*[ (!]__i860\([^_]\)/ s/__i860/__i860__/g
/#[a-z]*if.*[ (!]i860/ s/\([^_]\)i860/\1__i860__/g
/#[a-z]*if.*[ (]sparc/ s/\([^_]\)sparc/\1__sparc__/g
/#[a-z]*if.*[ (]mc68000/ s/\([^_]\)mc68000/\1__mc68000__/g
/#[a-z]*if.*[ (]vax/ s/\([^_]\)vax/\1__vax__/g
/#[a-z]*if.*[ (]sun/ s/\([^_]\)\(sun[a-z0-9]*\)\([^a-z0-9_]\)/\1__\2__\3/g
/#[a-z]*if.*[ (]sun/ s/\([^_]\)\(sun[a-z0-9]*\)$/\1__\2__/g
/#[a-z]*if.*[ (]ns32000/ s/\([^_]\)ns32000/\1__ns32000__/g
/#[a-z]*if.*[ (]pyr/ s/\([^_]\)pyr/\1__pyr__/g
/#[a-z]*if.*[ (]is68k/ s/\([^_]\)is68k/\1__is68k__/g
s/__STDC__[ ][ ]*==[ ][ ]*0/!defined (__STRICT_ANSI__)/g
s/__STDC__[ ][ ]*==[ ][ ]*1/defined (__STRICT_ANSI__)/g
s/__STDC__[ ][ ]*!=[ ][ ]*0/defined (__STRICT_ANSI__)/g
s/__STDC__[ ][ ]*!=[ ][ ]*1/!defined (__STRICT_ANSI__)/g
s/__STDC__ - 0 == 0/!defined (__STRICT_ANSI__)/g
s/__STDC__ - 0 == 1/defined (__STRICT_ANSI__)/g
/^typedef[ ][ ]*[unsigned ]*long[ ][ ]*[u_]*longlong_t;/s/long/long long/
' $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
done
shift; shift
done
# Install the proper definition of the three standard types in header files
# that they come from.
for file in sys/types.h stdlib.h sys/stdtypes.h stddef.h memory.h unistd.h; do
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 size_t, ptrdiff_t and wchar_t in $file
sed \
-e '/typedef[ ][ ]*[a-z_][ a-z_]*[ ]size_t/i\
#ifndef __SIZE_TYPE__\
#define __SIZE_TYPE__ long unsigned int\
#endif
' \
-e 's/typedef[ ][ ]*[a-z_][ a-z_]*[ ]size_t/typedef __SIZE_TYPE__ size_t/' \
-e '/typedef[ ][ ]*[a-z_][ a-z_]*[ ]ptrdiff_t/i\
#ifndef __PTRDIFF_TYPE__\
#define __PTRDIFF_TYPE__ long int\
#endif
' \
-e 's/typedef[ ][ ]*[a-z_][ a-z_]*[ ]ptrdiff_t/typedef __PTRDIFF_TYPE__ ptrdiff_t/' \
-e '/typedef[ ][ ]*[a-z_][ a-z_]*[ ]wchar_t/i\
#ifndef __WCHAR_TYPE__\
#define __WCHAR_TYPE__ int\
#endif
' \
-e 's/typedef[ ][ ]*[a-z_][ a-z_]*[ ]wchar_t/typedef __WCHAR_TYPE__ wchar_t/' \
${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
done
# 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 \*, 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 the definition of NULL in <sys/param.h> so that it is conditional
# and so that it is correct for both C and C++.
file=sys/param.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
cp $file_to_fix /tmp/$base
chmod +w /tmp/$base
chmod a+r /tmp/$base
sed -e '/^#define[ ]*NULL[ ]*0$/c\
#ifndef NULL\
#ifdef __cplusplus\
#define __NULL_TYPE\
#else /* !defined(__cplusplus) */\
#define __NULL_TYPE (void *)\
#endif /* !defined(__cplusplus) */\
#define NULL (__NULL_TYPE 0)\
#endif /* !defined(NULL) */' /tmp/$base > /tmp/$base.sed
if cmp $file_to_fix /tmp/$base.sed >/dev/null 2>&1; then \
true
else
echo Fixed $file_to_fix
rm -f ${LIB}/$file
cp /tmp/$base.sed ${LIB}/$file
chmod a+r ${LIB}/$file
fi
rm -f /tmp/$base /tmp/$base.sed
fi
# Likewise fix the definition of NULL in <stdio.h> so that it is conditional
# and so that it is correct for both C and C++.
file=stdio.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
cp $file_to_fix /tmp/$base
chmod +w /tmp/$base
sed -e '/^#define[ ]*NULL[ ]*0$/c\
#ifdef __cplusplus\
#define __NULL_TYPE\
#else /* !defined(__cplusplus) */\
#define __NULL_TYPE (void *)\
#endif /* !defined(__cplusplus) */\
#define NULL (__NULL_TYPE 0)' /tmp/$base > /tmp/$base.sed
if cmp $file_to_fix /tmp/$base.sed >/dev/null 2>&1; then \
true
else
echo Fixed $file_to_fix
rm -f ${LIB}/$file
cp /tmp/$base.sed ${LIB}/$file
chmod a+r ${LIB}/$file
fi
rm -f /tmp/$base /tmp/$base.sed
fi
# Likewise fix the definition of NULL in <dbm.h> so that it is conditional
# and so that it is correct for both C and C++.
file=dbm.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
cp $file_to_fix /tmp/$base
chmod +w /tmp/$base
sed -e '/^#define[ ]*NULL[ ]*((char \*) 0)$/c\
#ifndef NULL\
#ifdef __cplusplus\
#define __NULL_TYPE\
#else /* !defined(__cplusplus) */\
#define __NULL_TYPE (void *)\
#endif /* !defined(__cplusplus) */\
#define NULL (__NULL_TYPE 0)\
#endif /* !defined(NULL) */' /tmp/$base > /tmp/$base.sed
if cmp $file_to_fix /tmp/$base.sed >/dev/null 2>&1; then \
true
else
echo Fixed $file_to_fix
rm -f ${LIB}/$file
cp /tmp/$base.sed ${LIB}/$file
chmod a+r ${LIB}/$file
fi
rm -f /tmp/$base /tmp/$base.sed
fi
# Add a prototyped declaration of mmap to <sys/mman.h>.
file=sys/mman.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
cp $file_to_fix /tmp/$base
chmod +w /tmp/$base
sed -e '/^extern caddr_t mmap();$/c\
#ifdef __STDC__\
extern caddr_t mmap (caddr_t, size_t, int, int, int, off_t);\
#else /* !defined(__STDC__) */\
extern caddr_t mmap ();\
#endif /* !defined(__STDC__) */' /tmp/$base > /tmp/$base.sed
if cmp $file_to_fix /tmp/$base.sed >/dev/null 2>&1; then \
true
else
echo Fixed $file_to_fix
rm -f ${LIB}/$file
cp /tmp/$base.sed ${LIB}/$file
chmod a+r ${LIB}/$file
fi
rm -f /tmp/$base /tmp/$base.sed
fi
# Fix declarations of `ftw' and `nftw' in <ftw.h>. On some/most SVR4 systems
# the file <ftw.h> contains extern declarations of these functions followed
# by explicitly `static' definitions of these functions... and that's not
# allowed according to ANSI C. (Note however that on Solaris, this header
# file glitch has been pre-fixed by Sun. In the Solaris version of <ftw.h>
# there are no static definitions of any function so we don't need to do
# any of this stuff when on Solaris.
file=ftw.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 test -z "$file_to_fix" || grep 'define ftw' $file_to_fix > /dev/null; then
# Either we have no <ftw.h> file at all, or else we have the pre-fixed Solaris
# one. Either way, we don't have to do anything.
true
else
echo Checking $file_to_fix
cp $file_to_fix /tmp/$base
chmod +w /tmp/$base
sed -e '/^extern int ftw(const/i\
#if !defined(_STYPES)\
static\
#else\
extern\
#endif
'\
-e 's/extern \(int ftw(const.*\)$/\1/' \
-e '/^extern int nftw/i\
#if defined(_STYPES)\
static\
#else\
extern\
#endif
'\
-e 's/extern \(int nftw.*\)$/\1/' \
-e '/^extern int ftw(),/c\
#if !defined(_STYPES)\
static\
#else\
extern\
#endif\
int ftw();\
#if defined(_STYPES)\
static\
#else\
extern\
#endif\
int nftw();' /tmp/$base > /tmp/$base.sed
if cmp $file_to_fix /tmp/$base.sed >/dev/null 2>&1; then \
true
else
echo Fixed $file_to_fix
rm -f ${LIB}/$file
cp /tmp/$base.sed ${LIB}/$file
chmod a+r ${LIB}/$file
fi
rm -f /tmp/$base /tmp/$base.sed
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
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
cp $file_to_fix /tmp/$base
chmod +w /tmp/$base
sed -e 's,^typedef[ ]char[ ]bool;$,#ifndef __cplusplus\
typedef char bool;\
#endif /* !defined __cplusplus */,' /tmp/$base > /tmp/$base.sed
if cmp $file_to_fix /tmp/$base.sed >/dev/null 2>&1; then \
true
else
echo Fixed $file_to_fix
rm -f ${LIB}/$file
cp /tmp/$base.sed ${LIB}/$file
chmod a+r ${LIB}/$file
fi
rm -f /tmp/$base /tmp/$base.sed
fi
# Add a `static' declaration of `getrnge' into <regexp.h>.
# Don't do this if there is already a `static void getrnge' declaration
# present, since this would cause a redeclaration error. Solaris 2.x has
# such a declaration.
file=regexp.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 "static void getrnge" $file_to_fix > /dev/null; then
true
else
cp $file_to_fix /tmp/$base
chmod +w /tmp/$base
sed -e '/^static int[ ]*size;/c\
static int size ;\
\
static int getrnge ();' /tmp/$base > /tmp/$base.sed
if cmp $file_to_fix /tmp/$base.sed >/dev/null 2>&1; then \
true
else
echo Fixed $file_to_fix
rm -f ${LIB}/$file
cp /tmp/$base.sed ${LIB}/$file
chmod a+r ${LIB}/$file
fi
fi
rm -f /tmp/$base /tmp/$base.sed
fi
# Disable apparent native compiler optimization cruft in SVR4.2 <string.h>
# that is visible to any ANSI compiler using this include. Simply
# delete the lines that #define some string functions to internal forms.
file=string.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
cp $file_to_fix /tmp/$base
chmod +w /tmp/$base
sed -e '/#define.*__std_hdr_/d' /tmp/$base > /tmp/$base.sed
if cmp $file_to_fix /tmp/$base.sed >/dev/null 2>&1; then \
true
else
echo Fixed $file_to_fix
rm -f ${LIB}/$file
cp /tmp/$base.sed ${LIB}/$file
chmod a+r ${LIB}/$file
fi
rm -f /tmp/$base /tmp/$base.sed
fi
# Delete any #defines of `__i386' which may be present in <ieeefp.h>. They
# tend to conflict with the compiler's own definition of this symbol. (We
# will use the compiler's definition.)
# Likewise __sparc, for Solaris, and __i860, and a few others
# (guessing it is necessary for all of them).
file=ieeefp.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
cp $file_to_fix /tmp/$base
chmod +w /tmp/$base
sed -e '/#define[ ]*__i386 /d' -e '/#define[ ]*__sparc /d' \
-e '/#define[ ]*__i860 /d' -e '/#define[ ]*__m88k /d' \
-e '/#define[ ]*__mips /d' -e '/#define[ ]*__m68k /d' \
/tmp/$base > /tmp/$base.sed
if cmp $file_to_fix /tmp/$base.sed >/dev/null 2>&1; then \
true
else
echo Fixed $file_to_fix
rm -f ${LIB}/$file
cp /tmp/$base.sed ${LIB}/$file
chmod a+r ${LIB}/$file
fi
rm -f /tmp/$base /tmp/$base.sed
fi
# Add a #define of _SIGACTION_ into <sys/signal.h>.
# Also fix types of SIG_DFL, SIG_ERR, SIG_IGN, and SIG_HOLD.
file=sys/signal.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
cp $file_to_fix /tmp/$base
chmod +w /tmp/$base
sed -e '/^struct sigaction {/c\
#define _SIGACTION_\
struct sigaction {' \
-e '1,$s/(void *(\*)())/(void (*)(int))/' /tmp/$base > /tmp/$base.sed
if cmp $file_to_fix /tmp/$base.sed >/dev/null 2>&1; then \
true
else
echo Fixed $file_to_fix
rm -f ${LIB}/$file
cp /tmp/$base.sed ${LIB}/$file
chmod a+r ${LIB}/$file
fi
rm -f /tmp/$base /tmp/$base.sed
fi
# Fix declarations of `makedev', `major', and `minor' in <sys/mkdev.h>.
file=sys/mkdev.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
cp $file_to_fix /tmp/$base
chmod +w /tmp/$base
sed -e '/^dev_t makedev(const/c\
static dev_t makedev(const major_t, const minor_t);' \
-e '/^dev_t makedev()/c\
static dev_t makedev();' \
-e '/^major_t major(const/c\
static major_t major(const dev_t);' \
-e '/^major_t major()/c\
static major_t major();' \
-e '/^minor_t minor(const/c\
static minor_t minor(const dev_t);' \
-e '/^minor_t minor()/c\
static minor_t minor();' /tmp/$base > /tmp/$base.sed
if cmp $file_to_fix /tmp/$base.sed >/dev/null 2>&1; then \
true
else
echo Fixed $file_to_fix
rm -f ${LIB}/$file
cp /tmp/$base.sed ${LIB}/$file
chmod a+r ${LIB}/$file
fi
rm -f /tmp/$base /tmp/$base.sed
fi
# Fix reference to NMSZ in <sys/adv.h>.
file=sys/adv.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 's/\[NMSZ\]/\[RFS_NMSZ\]/g' $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 reference to NC_NPI_RAW in <sys/netcspace.h>. Also fix types of
# array initializers.
file=sys/netcspace.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 's/NC_NPI_RAW/NC_TPI_RAW/g' $file_to_fix \
| sed 's/NC_/(unsigned long) NC_/' > /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
# Conditionalize all of <fs/rfs/rf_cache.h> on _KERNEL being defined.
file=fs/rfs/rf_cache.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 _KERNEL $file_to_fix > /dev/null; then
true
else
echo '#ifdef _KERNEL' > /tmp/$base
cat $file_to_fix >> /tmp/$base
echo '#endif /* defined(_KERNEL) */' >> /tmp/$base
echo Fixed $file_to_fix
rm -f ${LIB}/$file
cp /tmp/$base ${LIB}/$file
chmod a+r ${LIB}/$file
rm -f /tmp/$base
fi
fi
# Conditionalize all of <sys/erec.h> on _KERNEL being defined.
file=sys/erec.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 _KERNEL $file_to_fix > /dev/null; then
true
else
echo '#ifdef _KERNEL' > /tmp/$base
cat $file_to_fix >> /tmp/$base
echo '#endif /* defined(_KERNEL) */' >> /tmp/$base
echo Fixed $file_to_fix
rm -f ${LIB}/$file
cp /tmp/$base ${LIB}/$file
chmod a+r ${LIB}/$file
rm -f /tmp/$base
fi
fi
# Conditionalize all of <sys/err.h> on _KERNEL being defined.
file=sys/err.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 _KERNEL $file_to_fix > /dev/null; then
true
else
echo '#ifdef _KERNEL' > /tmp/$base
cat $file_to_fix >> /tmp/$base
echo '#endif /* defined(_KERNEL) */' >> /tmp/$base
echo Fixed $file_to_fix
rm -f ${LIB}/$file
cp /tmp/$base ${LIB}/$file
chmod a+r ${LIB}/$file
rm -f /tmp/$base
fi
fi
# Conditionalize all of <sys/char.h> on _KERNEL being defined.
file=sys/char.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 _KERNEL $file_to_fix > /dev/null; then
true
else
echo '#ifdef _KERNEL' > /tmp/$base
cat $file_to_fix >> /tmp/$base
echo '#endif /* defined(_KERNEL) */' >> /tmp/$base
echo Fixed $file_to_fix
rm -f ${LIB}/$file
cp /tmp/$base ${LIB}/$file
chmod a+r ${LIB}/$file
rm -f /tmp/$base
fi
fi
# Conditionalize all of <sys/getpages.h> on _KERNEL being defined.
file=sys/getpages.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 _KERNEL $file_to_fix > /dev/null; then
true
else
echo '#ifdef _KERNEL' > /tmp/$base
cat $file_to_fix >> /tmp/$base
echo '#endif /* defined(_KERNEL) */' >> /tmp/$base
echo Fixed $file_to_fix
rm -f ${LIB}/$file
cp /tmp/$base ${LIB}/$file
chmod a+r ${LIB}/$file
rm -f /tmp/$base
fi
fi
# Conditionalize all of <sys/map.h> on _KERNEL being defined.
file=sys/map.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 _KERNEL $file_to_fix > /dev/null; then
true
else
echo '#ifdef _KERNEL' > /tmp/$base
cat $file_to_fix >> /tmp/$base
echo '#endif /* defined(_KERNEL) */' >> /tmp/$base
echo Fixed $file_to_fix
rm -f ${LIB}/$file
cp /tmp/$base ${LIB}/$file
chmod a+r ${LIB}/$file
rm -f /tmp/$base
fi
fi
# Conditionalize all of <sys/cmn_err.h> on _KERNEL being defined.
file=sys/cmn_err.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 _KERNEL $file_to_fix > /dev/null; then
true
else
echo '#ifdef _KERNEL' > /tmp/$base
cat $file_to_fix >> /tmp/$base
echo '#endif /* defined(_KERNEL) */' >> /tmp/$base
echo Fixed $file_to_fix
rm -f ${LIB}/$file
cp /tmp/$base ${LIB}/$file
chmod a+r ${LIB}/$file
rm -f /tmp/$base
fi
fi
# Conditionalize all of <sys/kdebugger.h> on _KERNEL being defined.
file=sys/kdebugger.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 _KERNEL $file_to_fix > /dev/null; then
true
else
echo '#ifdef _KERNEL' > /tmp/$base
cat $file_to_fix >> /tmp/$base
echo '#endif /* defined(_KERNEL) */' >> /tmp/$base
echo Fixed $file_to_fix
rm -f ${LIB}/$file
cp /tmp/$base ${LIB}/$file
chmod a+r ${LIB}/$file
rm -f /tmp/$base
fi
fi
# Conditionalize some of <netinet/in.h> on _KERNEL being defined.
# This has been taken out because it breaks on some versions of
# DYNIX/ptx, and it does not seem to do much good on any system.
# 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 _KERNEL $file_to_fix > /dev/null; then
# true
# else
# sed -e '/#ifdef INKERNEL/i\
# #ifdef _KERNEL
# ' \
# -e '/#endif[ ]*\/\* INKERNEL \*\//a\
# #endif /* _KERNEL */
# ' \
# $file_to_fix > ${LIB}/${file}.sed
# rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
# echo Fixed $file_to_fix
# fi
# fi
# Conditionalize some of <sys/endian.h> on __GNUC__ and __GNUG__.
file=sys/endian.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 '/# ifdef __STDC__/i\
# if !defined (__GNUC__) && !defined (__GNUG__)
' \
-e '/# include <sys\/byteorder.h>/s/ / /'\
-e '/# include <sys\/byteorder.h>/i\
# endif /* !defined (__GNUC__) && !defined (__GNUG__) */
'\
$file_to_fix > ${LIB}/${file}.sed
rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
echo Fixed $file_to_fix
fi
fi
# Commented out because tmcconne@sedona.intel.com says we don't clearly need it
# and the text in types.h is not erroneous.
## In sys/types.h, don't name the enum for booleans.
#
#file=sys/types.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 "enum boolean" $file_to_fix > /dev/null; then
# sed -e 's/enum boolean/enum/' ${LIB}/$file > ${LIB}/${file}.sed
# rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
# echo Fixed $file_to_fix
# else
# true
# fi
#fi
# Remove useless extern keyword from struct forward declarations in
# <sys/stream.h> and <sys/strsubr.h>
file=sys/stream.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/extern struct stdata;/struct stdata;/g
s/extern struct strevent;/struct strevent;/g
' $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
file=sys/strsubr.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/extern struct strbuf;/struct strbuf;/g
s/extern struct uio;/struct uio;/g
s/extern struct thread;/struct thread;/g
s/extern struct proc;/struct proc;/g
' $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
# Put storage class at start of decl, to avoid warning.
file=rpc/types.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/const extern/extern const/g
' $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
# Convert functions to prototype form, and fix arg names in <sys/stat.h>.
file=sys/stat.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
cp $file_to_fix /tmp/$base
chmod +w /tmp/$base
sed -e '/^stat([ ]*[^c]/{
N
N
s/(.*)\n/( /
s/;\n/, /
s/;$/)/
}' \
-e '/^lstat([ ]*[^c]/{
N
N
s/(.*)\n/( /
s/;\n/, /
s/;$/)/
}' \
-e '/^fstat([ ]*[^i]/{
N
N
s/(.*)\n/( /
s/;\n/, /
s/;$/)/
}' \
-e '/^mknod([ ]*[^c]/{
N
N
N
s/(.*)\n/( /
s/;\n/, /g
s/;$/)/
}' \
-e '1,$s/\([^A-Za-z]\)path\([^A-Za-z]\)/\1__path\2/g' \
-e '1,$s/\([^A-Za-z]\)buf\([^A-Za-z]\)/\1__buf\2/g' \
-e '1,$s/\([^A-Za-z]\)fd\([^A-Za-z]\)/\1__fd\2/g' \
-e '1,$s/ret\([^u]\)/__ret\1/g' \
-e '1,$s/\([^_]\)mode\([^_]\)/\1__mode\2/g' \
-e '1,$s/\([^_r]\)dev\([^_]\)/\1__dev\2/g' /tmp/$base > /tmp/$base.sed
if cmp $file_to_fix /tmp/$base.sed >/dev/null 2>&1; then \
true
else
echo Fixed $file_to_fix
rm -f ${LIB}/$file
cp /tmp/$base.sed ${LIB}/$file
chmod a+r ${LIB}/$file
fi
rm -f /tmp/$base /tmp/$base.sed
fi
# Sony NEWSOS 5.0 does not support the complete ANSI C standard.
if [ -x /bin/sony ]; then
if /bin/sony; then
# Change <stdio.h> to not define __filbuf, __flsbuf, and __iob
file=stdio.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
cp $file_to_fix /tmp/$base
chmod +w /tmp/$base
sed -e '
s/__filbuf/_filbuf/g
s/__flsbuf/_flsbuf/g
s/__iob/_iob/g
' /tmp/$base > /tmp/$base.sed
mv /tmp/$base.sed /tmp/$base
if cmp $file_to_fix /tmp/$base.sed >/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
# Change <ctype.h> to not define __ctype
file=ctype.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
cp $file_to_fix /tmp/$base
chmod +w /tmp/$base
sed -e '
s/__ctype/_ctype/g
' /tmp/$base > /tmp/$base.sed
mv /tmp/$base.sed /tmp/$base
if cmp $file_to_fix /tmp/$base.sed >/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
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.
# Solaris 2.1 has this problem.
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
# Completely replace <sys/varargs.h> with a file that includes gcc's
# stdarg.h or varargs.h files as appropriate.
file=sys/varargs.h
if [ -r ${INPUT}/$file ]; then
echo Replacing $file
cat > ${LIB}/$file << EOF
/* This file was generated by fixincludes. */
#ifndef _SYS_VARARGS_H
#define _SYS_VARARGS_H
#ifdef __STDC__
#include <stdarg.h>
#else
#include <varargs.h>
#endif
#endif /* _SYS_VARARGS_H */
EOF
chmod a+r ${LIB}/$file
fi
# In math.h, put #ifndefs around things that might be defined in a gcc
# specific math-*.h file.
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 '/define[ ]HUGE_VAL[ ]/i\
#ifndef HUGE_VAL
'\
-e '/define[ ]HUGE_VAL[ ]/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
# Solaris math.h and floatingpoint.h define __P without protection,
# which conflicts with the fixproto definition. The fixproto
# definition and the Solaris definition are used the same way.
for file in math.h floatingpoint.h; do
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 '/^#define[ ]*__P/i\
#ifndef __P
'\
-e '/^#define[ ]*__P/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
done
# The Solaris 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.
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' $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
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}
echo 'Replacing <sys/byteorder.h>'
if [ \! -d $LIB/sys ]; then
mkdir $LIB/sys
fi
rm -f ${LIB}/sys/byteorder.h
cat <<'__EOF__' >${LIB}/sys/byteorder.h
#ifndef _SYS_BYTEORDER_H
#define _SYS_BYTEORDER_H
/* Functions to convert `short' and `long' quantities from host byte order
to (internet) network byte order (i.e. big-endian).
Written by Ron Guilmette (rfg@ncd.com).
This isn't actually used by GCC. It is installed by fixinc.svr4.
For big-endian machines these functions are essentially no-ops.
For little-endian machines, we define the functions using specialized
asm sequences in cases where doing so yields better code (e.g. i386). */
#if !defined (__GNUC__) && !defined (__GNUG__)
#error You lose! This file is only useful with GNU compilers.
#endif
#ifndef __BYTE_ORDER__
/* Byte order defines. These are as defined on UnixWare 1.1, but with
double underscores added at the front and back. */
#define __LITTLE_ENDIAN__ 1234
#define __BIG_ENDIAN__ 4321
#define __PDP_ENDIAN__ 3412
#endif
#ifdef __STDC__
static __inline__ unsigned long htonl (unsigned long);
static __inline__ unsigned short htons (unsigned int);
static __inline__ unsigned long ntohl (unsigned long);
static __inline__ unsigned short ntohs (unsigned int);
#endif /* defined (__STDC__) */
#if defined (__i386__)
#ifndef __BYTE_ORDER__
#define __BYTE_ORDER__ __LITTLE_ENDIAN__
#endif
/* Convert a host long to a network long. */
/* We must use a new-style function definition, so that this will also
be valid for C++. */
static __inline__ unsigned long
htonl (unsigned long __arg)
{
register unsigned long __result;
__asm__ ("xchg%B0 %b0,%h0\n\
ror%L0 $16,%0\n\
xchg%B0 %b0,%h0" : "=q" (__result) : "0" (__arg));
return __result;
}
/* Convert a host short to a network short. */
static __inline__ unsigned short
htons (unsigned int __arg)
{
register unsigned short __result;
__asm__ ("xchg%B0 %b0,%h0" : "=q" (__result) : "0" (__arg));
return __result;
}
#elif ((defined (__i860__) && !defined (__i860_big_endian__)) \
|| defined (__ns32k__) || defined (__vax__) \
|| defined (__spur__) || defined (__arm__))
#ifndef __BYTE_ORDER__
#define __BYTE_ORDER__ __LITTLE_ENDIAN__
#endif
/* For other little-endian machines, using C code is just as efficient as
using assembly code. */
/* Convert a host long to a network long. */
static __inline__ unsigned long
htonl (unsigned long __arg)
{
register unsigned long __result;
__result = (__arg >> 24) & 0x000000ff;
__result |= (__arg >> 8) & 0x0000ff00;
__result |= (__arg << 8) & 0x00ff0000;
__result |= (__arg << 24) & 0xff000000;
return __result;
}
/* Convert a host short to a network short. */
static __inline__ unsigned short
htons (unsigned int __arg)
{
register unsigned short __result;
__result = (__arg << 8) & 0xff00;
__result |= (__arg >> 8) & 0x00ff;
return __result;
}
#else /* must be a big-endian machine */
#ifndef __BYTE_ORDER__
#define __BYTE_ORDER__ __BIG_ENDIAN__
#endif
/* Convert a host long to a network long. */
static __inline__ unsigned long
htonl (unsigned long __arg)
{
return __arg;
}
/* Convert a host short to a network short. */
static __inline__ unsigned short
htons (unsigned int __arg)
{
return __arg;
}
#endif /* big-endian */
/* Convert a network long to a host long. */
static __inline__ unsigned long
ntohl (unsigned long __arg)
{
return htonl (__arg);
}
/* Convert a network short to a host short. */
static __inline__ unsigned short
ntohs (unsigned int __arg)
{
return htons (__arg);
}
__EOF__
if [ -r ${INPUT}/sys/byteorder.h ]; then
if grep BYTE_ORDER ${INPUT}/sys/byteorder.h >/dev/null 2>/dev/null; then
cat <<'__EOF__' >>${LIB}/sys/byteorder.h
#ifndef BYTE_ORDER
#define LITTLE_ENDIAN __LITTLE_ENDIAN__
#define BIG_ENDIAN __BIG_ENDIAN__
#define PDP_ENDIAN __PDP_ENDIAN__
#define BYTE_ORDER __BYTE_ORDER__
#endif
__EOF__
fi
fi
cat <<'__EOF__' >>${LIB}/sys/byteorder.h
#endif /* !defined (_SYS_BYTEORDER_H) */
__EOF__
chmod a+r ${LIB}/sys/byteorder.h
exit 0
#! 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
#! /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
/*
* $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);
}
[= 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=]
};
[= 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
/* -*- Mode: C -*- $Id: inclhack.def,v 1.2 1998/12/16 21:19:09 law Exp $ */
autogen definitions inclhack;
/*
* Define all the fixes we know about for repairing damaged headers
*/
/*
* sys/wait.h on AIX 3.2.5 puts the declaration of wait3 before the definition
* of struct rusage, so the prototype (added by fixproto) causes havoc.
*/
fix = {
hackname = aix_syswait;
files = sys/wait.h;
select = "bos325,";
sed = "/^extern pid_t wait3();$/i\\\n"
"struct rusage;\n";
};
/*
* sys/signal.h on some versions of AIX uses volatile in the typedef of
* sig_atomic_t, which causes gcc to generate a warning about duplicate
* volatile when a sig_atomic_t variable is declared volatile, as
* required by ANSI C.
*/
fix = {
hackname = aix_volatile;
files = sys/signal.h;
select = "typedef volatile int sig_atomic_t";
sed = "s/typedef volatile int sig_atomic_t"
"/typedef int sig_atomic_t/";
};
/*
* Fix getopt declarations in stdio.h and stdlib.h on Alpha OSF/1 and AIX.
*/
fix = {
hackname = alpha_getopt;
files = "stdio.h";
files = "stdlib.h";
select = 'getopt\(int, char \*\[';
sed = 's/getopt(int, char \*\[\],[ ]*char \*)/'
'getopt(int, char *const[], const char *)/';
};
/*
* Determine if we're on Interactive Unix 2.2 or later, in which case we
* need to fix some additional files. This is the same test for ISC that
* Autoconf uses. On Interactive 2.2, certain traditional Unix
* definitions (notably getc and putc in stdio.h) are omitted if __STDC__
* is defined, not just if _POSIX_SOURCE is defined. This makes it
* impossible to compile any nontrivial program except with -posix.
*/
fix = {
hackname = alpha_parens;
files = sym.h;
select = '#ifndef\(__mips64\)';
sed = "s/#ifndef(__mips64)/#ifndef __mips64/";
};
/*
* Fix return value of sbrk in unistd.h on Alpha OSF/1 V2.0
*/
fix = {
hackname = alpha_sbrk;
files = unistd.h;
select = "char[ \t]*\\*[\t ]*sbrk[ \t]*\\(";
sed = "s/char\\([ \t]*\\*[\t ]*sbrk[ \t]*(\\)/void\\1/";
};
/*
* Fix this ARM/RISCiX file where ___type is a Compiler
* hint that is specific to the Norcroft compiler.
*/
fix = {
hackname = arm_norcroft_hint;
files = "X11/Intrinsic.h";
sed = "s/___type p_type/p_type/";
};
/*
* Fix this ARM/RISCiX file to avoid interfering
* with the use of __wchar_t in cc1plus.
*/
fix = {
hackname = arm_wchar;
files = stdlib.h;
select = "#[ \t]*define[ \t]*__wchar_t";
sed = "s/\\(#[ \t]*ifndef[ \t]*\\)__wchar_t/\\1_GCC_WCHAR_T/";
sed = "s/\\(#[ \t]*define[ \t]*\\)__wchar_t/\\1_GCC_WCHAR_T/";
};
/*
* This file in A/UX 3.0.x/3.1.x contains an __asm directive for c89;
* gcc doesn't understand it.
*/
fix = {
hackname = aux_asm;
files = sys/param.h;
select = "#ifndef NOINLINE";
sed = "s|#ifndef NOINLINE"
"|#if !defined(NOINLINE) \\&\\& !defined(__GNUC__)|";
};
/*
* For C++, avoid any typedef or macro definition of bool,
* and use the built in type instead.
*/
fix = {
hackname = avoid_bool;
files = curses.h;
files = term.h;
files = tinfo.h;
sed = "/^#[ \t]*define[ \t][ \t]*bool[ \t][ \t]*char[ \t]*$/i\\\n"
"#ifndef __cplusplus\n";
sed = "/^#[ \t]*define[ \t][ \t]*bool[ \t][ \t]*char[ \t]*$/a\\\n"
"#endif\n";
sed = "/^typedef[ \t][ \t]*char[ \t][ \t]*bool[ \t]*;/i\\\n"
"#ifndef __cplusplus\n";
sed = "/^typedef[ \t][ \t]*char[ \t][ \t]*bool[ \t]*;/a\\\n"
"#endif\n";
};
/*
* rpc/types.h on OSF1/2.0 is not C++ ready, even though NO_IMPLICIT_EXTERN_C
* is defined for the alpha. The problem is the declaration of malloc.
*/
fix = {
hackname = bad_malloc_decl;
files = rpc/types.h;
bypass = '"C"';
sed = "1i\\\n"
"#ifdef __cplusplus\\\n"
"extern \"C\" {\\\n"
"#endif\\\n\n";
sed = "$a\\\n"
"#ifdef __cplusplus\\\n"
"}\\\n"
"#endif\n";
};
/*
* Fix `typedef struct term;' on hppa1.1-hp-hpux9.
*/
fix = {
hackname = bad_struct_term;
files = curses.h;
select = "^[ \t]*typedef[ \t]+struct[ \t]+term[ \t]*;";
sed = "s/^[ \t]*typedef[ \t][ \t]*"
"\\(struct[ \t][ \t]*term[ \t]*;[ \t]*\\)$/\\1/";
};
/*
* Fix one other error in this file:
* a mismatched quote not inside a C comment.
*/
fix = {
hackname = badquote;
files = sundev/vuid_event.h;
sed = "s/doesn't/does not/";
};
/*
* Fix #defines under Alpha OSF/1:
* The following files contain '#pragma extern_prefix "_FOO"' followed by
* a '#define something(x,y,z) _FOOsomething(x,y,z)'. The intent of these
* statements is to reduce namespace pollution. While these macros work
* properly in most cases, they don't allow you to take a pointer to the
* "something" being modified. To get around this limitation, change these
* statements to be of the form '#define something _FOOsomething'.
*/
fix = {
hackname = bad_lval;
select = "^[ \t]*#[ \t]*pragma[ \t]extern_prefix";
files = libgen.h;
files = dirent.h;
files = ftw.h;
files = grp.h;
files = ndbm.h;
files = pthread.h;
files = pwd.h;
files = signal.h;
files = standards.h;
files = stdlib.h;
files = string.h;
files = stropts.h;
files = time.h;
files = unistd.h;
sed =
"s/^[ \t]*#[ \t]*define[ \t]*\\([^(]*\\)\\(([^)]*)\\)[ \t]*"
"\\(_.\\)\\1\\2[ \t]*$/#define \\1 \\3\\1/";
};
/*
* check for broken assert.h that needs stdio.h
*/
fix = {
hackname = broken_assert_stdio;
files = assert.h;
select = stderr;
bypass = "include.*stdio.h";
sed = "1i\\\n"
"#include <stdio.h>\n";
};
/*
* check for broken assert.h that needs stdlib.h
*/
fix = {
hackname = broken_assert_stdlib;
files = assert.h;
select = 'exit *\(|abort *\(';
bypass = "include.*stdlib.h";
sed = "1i\\\n"
"#ifdef __cplusplus\\\n"
"#include <stdlib.h>\\\n"
"#endif\n";
};
/*
* Note that BSD43_* are used on recent MIPS systems.
*/
fix = {
hackname = bsd43_io_macros;
select = "BSD43__IO";
/*
* Put single quotes aroung the character that appears after '('
* and before ',', UNLESS it is a 'c' or 'g' or 'x'.
*/
sed = "/[ \t]BSD43__IO[A-Z]*[ \t]*(/" 's/(\(.\),/(\'\1\',/';
sed = "/#[ \t]*define[ \t]*[ \t]BSD43__IO/" 's/\'\([cgx]\)\'/\1/g';
};
#IFDEF no_more
/*
* And also with the HP-UX 10 and HP-UX 11 sys/pci.h file
*/
fix = {
hackname = cxx_cmnt_hpux;
files = sys/pci.h;
select = "System Private Structures";
sed = "s|//.*$||g";
};
/*
* Turning // comments into normal comments trashes this IRIX 4.0.1
* header file, which embeds // comments inside multi-line
* comments. If this looks like the IRIX header file, we refix it by
* just throwing away the // comments.
*/
fix = {
hackname = cxx_cmnt_irix;
files = fam.h;
select = indigo.esd;
sed = "s|//.*$||g";
};
/*
* Same problem with a file from SunOS 4.1.3 : a header file containing
* the string "//" embedded in "/ * * /"
*/
fix = {
hackname = cxx_cmnt_sunos;
files = sbusdev/audiovar.h;
files = sys/audiovar.h;
sed = "s|//.*$||g";
};
/*
* There is a similar problem with the VxWorks drv/netif/if_med.h file.
*/
fix = {
hackname = cxx_cmnt_vxworks;
files = drv/netif/if_med.h;
select = "Wind River";
sed = "s|//.*$||g";
};
#endif
/*
* Remove the double-slash comments
* They *must* be removed so it will not create nested comments!!
* However, they will *not* be removed if '++' is in any part of
* the file name, or if the name ends with ".hh" or ".H".
*
* There *used* to be a number of similar problems in various OSes:
* Turning // comments into normal comments trashes this IRIX 4.0.1
* header file, which embeds // comments inside multi-line
* comments. If this looks like the IRIX header file, we refix it by
* just throwing away the // comments.
* Same problem with a file from SunOS 4.1.3 : a header file containing
* the string "//" embedded in "/ * * /"
* There is a similar problem with the VxWorks drv/netif/if_med.h file.
* And also with the HP-UX 10 and HP-UX 11 sys/pci.h file
*/
fix = {
hackname = no_double_slash;
test = '-z "`echo ${file}|egrep \'++$|\.hh$|\.H$\'`"';
select = '//[^*]';
sed = '/\/\/[^*]/' "s|//.*$||g";
};
/*
* Multiline comment after typedef on IRIX 4.0.1.
*/
fix = {
hackname = irix_bogus_cxx_cmnt;
files = "elf_abi.h";
files = "elf.h";
/*
* This really looks like it is replacing "/ * * /" with "//"
* Shouldn't the replacement really be " ## "?
*/
sed = 's@"/\*"\*/@"//"@';
};
/*
* Fix these Sun OS files to avoid an invalid identifier in an #ifdef.
*/
fix = {
hackname = ecd_cursor;
files = "sunwindow/win_lock.h";
files = "sunwindow/win_cursor.h";
sed = "s/ecd.cursor/ecd_cursor/";
};
/*
* Fix else directives that contain non-commentary text
*
* The fixinc_eol stuff is to work around a bug in the sed
*/
fix = {
hackname = else_label;
select = "^[ \t]*#[ \t]*else[ \t]+[!-.0-~]";
sed = ":loop\n"
'/\\\\$/' "N\n"
's/\\\\$/\\\\+++fixinc_eol+++/' "\n"
'/\\\\$/' "b loop\n"
's/\\\\+++fixinc_eol+++/\\\\/g' "\n"
"s%^\\([ \t]*#[ \t]*else\\)[ \t]*/[^*].*%\\1%\n"
"s%^\\([ \t]*#[ \t]*else\\)[ \t]*[^/ \t].*%\\1%";
};
/*
* Fix endif directives that contain non-commentary text
*/
fix = {
hackname = endif_label;
/*
* Select files that contain '#endif' directives with
* some sort of following junk. (Between the ascii '.'
* and '0' lies the character '/'. This will *NOT*
* match '#endif / * foo * /', but it also wont match
* '#endif / done' either.
*
* We use the pattern [!-.0-z{|}~] instead of [^/ \t] to match a noncomment
* following #else or #endif because some buggy egreps think [^/] matches
* newline, and they thus think `#else ' matches
* `#e[ndiflse]*[ \t]+[^/ \t]'.
* [!-.0-~] does not work properly on AIX 4.1.
*/
select = "^[ \t]*#[ \t]*endif[ \t]+[!-.0-z\{\|\}\~]";
/*
* First, join the continued input lines.
* IF the resulting line is an endif preprocessing directive,
* then trim off the following patterns:
* 1. sequences that start with '/' and is *NOT* followed by '*'
* 2. Sequences that start with '*' and is *NOT* followed by '/'
* 3. sequences that do not start with any of '/', '*', '\t' or ' '.
*
* The fixinc_eol stuff is to work around a bug in the sed
*/
sed = ":loop\n"
'/\\\\$/' "N\n"
's/\\\\$/\\\\+++fixinc_eol+++/' "\n"
'/\\\\$/' "b loop\n"
's/\\\\+++fixinc_eol+++/\\\\/g' "\n"
"s%^\\([ \t]*#[ \t]*endif\\)[ \t]*/[^*].*%\\1%\n"
"s%^\\([ \t]*#[ \t]*endif\\)[ \t]*\\*[^/].*%\\1%\n"
"s%^\\([ \t]*#[ \t]*endif\\)[ \t]*[^/* \t].*%\\1%";
};
/*
* Fix HP's use of ../machine/inline.h to refer to
* /usr/include/machine/inline.h
*/
fix = {
hackname = hp_inline;
files = sys/spinlock.h;
select = 'include.*"\.\./machine/';
sed = "s,\"../machine/inline.h\",<machine/inline.h>,";
sed = "s,\"../machine/psl.h\",<machine/psl.h>,";
};
/*
* Check for (...) in C++ code in HP/UX sys/file.h.
*/
fix = {
hackname = hp_sysfile;
files = sys/file.h;
select = "HPUX_SOURCE";
sed = 's/(\.\.\.)/(struct file * ...)/';
};
/*
* sys/mman.h on HP/UX is not C++ ready,
* even though NO_IMPLICIT_EXTERN_C is defined on HP/UX.
*/
fix = {
hackname = hpux_cxx_unready;
files = sys/mman.h;
bypass = '"C"|__BEGIN_DECLS';
sed = "1i\\\n"
"#ifdef __cplusplus\\\n"
"extern \"C\" {\\\n"
"#endif\\\n\n";
sed = "$a\\\n"
"#ifdef __cplusplus\\\n"
"}\\\n"
"#endif\n";
};
/*
* HPUX 10.x sys/param.h defines MAXINT which clashes with values.h
*/
fix = {
hackname = hpux_maxint;
files = sys/param.h;
sed = "/^#[ \t]*define[ \t]*MAXINT[ \t]/i\\\n"
"#ifndef MAXINT\n";
sed = "/^#[ \t]*define[ \t]*MAXINT[ \t]/a\\\n"
"#endif\n";
};
/*
* Fix hpux10.20 <sys/time.h> to avoid invalid forward decl
*/
fix = {
hackname = hpux_systime;
files = sys/time.h;
select = "^extern struct sigevent;";
sed = "s/^extern struct sigevent;/struct sigevent;/";
};
/*
* Fix various _IO* defines, but do *not* quote the characters cgxtf.
*/
fix = {
hackname = interactv_add1;
test = "-d /etc/conf/kconfig.d";
test = '-n "`grep _POSIX_VERSION /usr/include/sys/unistd.h`"';
files = "stdio.h";
files = "math.h";
files = "ctype.h";
files = "sys/limits.h";
files = "sys/fcntl.h";
files = "sys/dirent.h";
sed = "s/!defined(__STDC__) && !defined(_POSIX_SOURCE)/"
"!defined(_POSIX_SOURCE)/";
};
fix = {
hackname = interactv_add2;
test = "-d /etc/conf/kconfig.d";
test = '-n "`grep _POSIX_VERSION /usr/include/sys/unistd.h`"';
files = math.h;
sed = "s/fmod(double)/fmod(double, double)/";
};
fix = {
hackname = interactv_add3;
test = "-d /etc/conf/kconfig.d";
test = '-n "`grep _POSIX_VERSION /usr/include/sys/unistd.h`"';
files = sys/limits.h;
sed = "/CHILD_MAX/s,/\\* Max, Max,";
sed = "/OPEN_MAX/s,/\\* Max, Max,";
};
/*
* Remove erroneous parentheses in sym.h on Alpha OSF/1.
*/
fix = {
hackname = io_def_quotes;
select = "[ \t]_IO[A-Z]*[ \t]*\\([A-Za-z]";
sed = "s/\\([ \t]_IO[A-Z]*[ \t]*(\\)\\([A-Za-z]\\),/\\1'\\2',/";
sed = "/#[ \t]*define[ \t]*[ \t]_IO/"
"s/'\\([cgxtf]\\)'/\\1/g";
sed = "/#[ \t]*define[ \t]*[ \t]DESIOC/" 's/\'\([cdgx]\)\'/\1/g';
};
/*
* Fix CTRL macros
*/
fix = {
hackname = ioctl_fix_ctrl;
select = "CTRL[ \t]";
sed = "/[^A-Z0-9_]CTRL[ \t]*(/"
"s/\\([^']\\))/'\\1')/";
sed = "/[^A-Z0-9]_CTRL[ \t]*(/"
"s/\\([^']\\))/'\\1')/";
sed = "/#[ \t]*define[ \t]*[ \t]CTRL/"
"s/'\\([cgx]\\)'/\\1/g";
sed = "/#[ \t]*define[ \t]*[ \t]_CTRL/"
"s/'\\([cgx]\\)'/\\1/g";
sed = "/#[ \t]*define[ \t]*[ \t]BSD43_CTRL/"
"s/'\\([cgx]\\)'/\\1/g";
};
/*
* Check for missing ';' in struct
*/
fix = {
hackname = ip_missing_semi;
files = netinet/ip.h;
sed = "/^struct/,/^};/s/}$/};/";
};
/*
* IRIX 4.0.5 <rpc/auth.h> uses struct sockaddr
* in prototype without previous definition.
*/
fix = {
hackname = irix_multiline_cmnt;
files = sys/types.h;
sed = "s@type of the result@type of the result */@";
sed = "s@of the sizeof@/* of the sizeof@";
};
/*
* Some IRIX header files contain the string "//"
*/
fix = {
hackname = irix_sockaddr;
files = rpc/auth.h;
select = "authdes_create.*struct sockaddr";
sed = "/authdes_create.*struct sockaddr/i\\\n"
"struct sockaddr;\n";
};
/*
* IRIX 4.0.5 <rpc/xdr.h> uses struct __file_s
* in prototype without previous definition.
*/
fix = {
hackname = irix_struct__file;
files = rpc/xdr.h;
sed = "/xdrstdio_create.*struct __file_s/i\\\n"
"struct __file_s;\n";
};
/*
* Fixing ISC fmod declaration
*/
fix = {
hackname = isc_fmod;
files = math.h;
select = 'fmod\(double\)';
sed = "s/fmod(double)/fmod(double, double)/";
};
/*
* Fix nested comments in Motorola's <limits.h> and <sys/limits.h>
*/
fix = {
hackname = motorola_nested;
files = limits.h;
files = sys/limits.h;
sed = "s@^\\(#undef[ \t][ \t]*PIPE_BUF[ \t]*"
"/\\* max # bytes atomic in write to a\\)$@\\1 */@";
sed = "s@\\(/\\*#define\tHUGE_VAL\t3.40282346638528860e+38 \\)"
"\\(/\\*error value returned by Math lib\\*/\\)$@\\1*/ \\2@";
};
/*
* Fixing nested comments in ISC <sys/limits.h>
*/
fix = {
hackname = isc_sys_limits;
files = sys/limits.h;
select = CHILD_MAX;
sed = "/CHILD_MAX/s,/\\* Max, Max,";
sed = "/OPEN_MAX/s,/\\* Max, Max,";
};
/*
* These files in Sun OS 4.x and ARM/RISCiX and BSD4.3
* use / * * / to concatenate tokens.
*/
fix = {
hackname = kandr_concat;
files = "sparc/asm_linkage.h";
files = "sun3/asm_linkage.h";
files = "sun3x/asm_linkage.h";
files = "sun4/asm_linkage.h";
files = "sun4c/asm_linkage.h";
files = "sun4m/asm_linkage.h";
files = "sun4c/debug/asm_linkage.h";
files = "sun4m/debug/asm_linkage.h";
files = "arm/as_support.h";
files = "arm/mc_type.h";
files = "arm/xcb.h";
files = "dev/chardefmac.h";
files = "dev/ps_irq.h";
files = "dev/screen.h";
files = "dev/scsi.h";
files = "sys/tty.h";
files = "Xm.acorn/XmP.h";
files = bsd43/bsd43_.h;
select = '/\*\*/';
sed = 's|/\*\*/| ## |g';
};
/*
* 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.
* On HP/UX this patch does not work, because on HP/UX limits.h uses
* multi line comments and the inserted #endif winds up inside the
* comment. Fortunately, HP/UX already uses #ifndefs in limits.h; if
* we find a #ifndef FLT_MIN we assume that all the required #ifndefs
* are there, and we do not add them ourselves.
* Also fix a nested comment problem in sys/limits.h on Motorola sysV68 R3V7.1
*/
fix = {
hackname = limits_ifndefs;
files = "limits.h";
bypass = "ifndef[ \t]+FLT_MIN";
sed = "/[ \t]FLT_MIN[ \t]/i\\\n#ifndef FLT_MIN\n";
sed = "/[ \t]FLT_MIN[ \t]/a\\\n#endif\n";
sed = "/[ \t]FLT_MAX[ \t]/i\\\n#ifndef FLT_MAX\n";
sed = "/[ \t]FLT_MAX[ \t]/a\\\n#endif\n";
sed = "/[ \t]FLT_DIG[ \t]/i\\\n#ifndef FLT_DIG\n";
sed = "/[ \t]FLT_DIG[ \t]/a\\\n#endif\n";
sed = "/[ \t]DBL_MIN[ \t]/i\\\n#ifndef DBL_MIN\n";
sed = "/[ \t]DBL_MIN[ \t]/a\\\n#endif\n";
sed = "/[ \t]DBL_MAX[ \t]/i\\\n#ifndef DBL_MAX\n";
sed = "/[ \t]DBL_MAX[ \t]/a\\\n#endif\n";
sed = "/[ \t]DBL_DIG[ \t]/i\\\n#ifndef DBL_DIG\n";
sed = "/[ \t]DBL_DIG[ \t]/a\\\n#endif\n";
sed = "/^\\(\\/\\*#define\tHUGE_VAL\t3\\.[0-9e+]* *\\)\\/\\*/s//\\1/";
};
/*
* Delete the '#define void int' line from curses.h on Lynx
*/
fix = {
hackname = lynx_void_int;
files = curses.h;
select = "#[ \t]*define[ \t]+void[ \t]+int";
sed = "/#[ \t]*define[ \t][ \t]*void[ \t]int/d";
};
/*
* Fix fcntl prototype in fcntl.h on LynxOS.
*/
fix = {
hackname = lynxos_fcntl_proto;
files = fcntl.h;
sed = 's/\(fcntl.*(int, int, \)int)/\1...)/';
};
/*
* Fix incorrect S_IF* definitions on m88k-sysv3.
*/
fix = {
hackname = m88k_bad_hypot_opt;
mach = "m88k-motorola-sysv3*";
files = "math.h";
sed = "s/extern double floor(), ceil(), fmod(), fabs();/"
"extern double floor(), ceil(), fmod(), fabs _PARAMS((double));/";
sed = "/^extern double hypot();$/a\\\n"
"\\/* Workaround a stupid Motorola optimization if one\\\n"
" of x or y is 0.0 and the other is negative! *\\/\\\n"
"#ifdef __STDC__\\\n"
"static __inline__ double fake_hypot (double x, double y)\\\n"
"#else\\\n"
"static __inline__ double fake_hypot (x, y)\\\n"
"\tdouble x, y;\\\n"
"#endif\\\n"
"{\\\n"
"\treturn fabs (hypot (x, y));\\\n"
"}\\\n"
"#define hypot\tfake_hypot\n";
};
/*
* Fix non-ansi machine name defines
* This is split into two parts: the shell version as a single
* patch, and the program version with each patch separate.
* Each is substantially faster for the particular environment.
* You have a dual maintenance problem here. */
fix = {
hackname = m88k_bad_s_if;
mach = "m88k-*-sysv3*";
files = sys/stat.h;
select = "#define[ \t]+S_IS[A-Z]*(m)[ \t]";
sed = "s/^\\(#define[ \t]*S_IS[A-Z]*(m)\\)[ \t]*"
"(m[ \t]*&[ \t]*\\(S_IF[A-Z][A-Z][A-Z][A-Z]*\\)[ \t]*)/"
"\\1 (((m)\\&S_IFMT)==\\2)/";
sed = "s/^\\(#define[ \t]*S_IS[A-Z]*(m)\\)[ \t]*"
"(m[ \t]*&[ \t]*\\(0[0-9]*\\)[ \t]*)/"
"\\1 (((m)\\&S_IFMT)==\\2)/";
};
/*
* Put cpp wrappers around these include files to avoid redeclaration
* errors during multiple inclusion on m88k-tektronix-sysv3.
*/
fix = {
hackname = m88k_multi_incl;
mach = "m88k-tektronix-sysv3*";
files = "time.h";
bypass = "#ifndef";
shell =
"echo Fixing $file, to protect against multiple inclusion. >&2
cpp_wrapper=`echo $file | sed -e 's,\\.,_,g' -e 's,/,_,g'`
sed -e \"1i\\\n"
"#ifndef __GCC_GOT_${cpp_wrapper}_\\\n"
"#define __GCC_GOT_${cpp_wrapper}_\\\n\" \\\n"
"\t-e \"$a\\\n"
"#endif /* ! __GCC_GOT_${cpp_wrapper}_ */\n\"";
};
/*
* libm.a on m88k-motorola-sysv3 contains a stupid optimization for
* function hypot(), which returns the second argument without even
* looking at its value if the other is 0.0 Another drawback is that
* fix-header doesn't fix fabs' prototype, and I have no idea why.
*/
fix = {
hackname = machine_name;
/*
* Select '#if.*' and '#elif" with possible non-ansi symbols
* The only non-ansi symbols we know about start with one of:
* MRS_bhimnprstuv
* If any are added to the substitution list, then add it to
* the selection list as well. Hopefully we can avoid names
* starting with "d" and "l", because this pattern would then
* match "defined" and "lint" as well. I suppose we could add
* a "bypass = lint" if we had to though.
*
* The fixinc_eol stuff is to work around a bug in the sed
*/
select = "^#[ \t]*(if|elif).*"
"[^a-zA-Z0-9_](_*[MSRrhim]|[Mbimnpstuv])[a-zA-Z0-9_]";
exesel = "^#[ \t]*(if|elif).*[^a-zA-Z0-9_]"
"("
"M32"
"|_*("
"MIPSE[LB]"
"|SYSTYPE_[A-Z0-9]"
"|[Rr][34]000"
"|host_mips"
"|i386"
"|mips"
")($|[^a-zA-Z0-9_])"
"|bsd4"
"|is68k"
"|m[68]8k"
"|mc680"
"|news"
"|ns32000"
"|pdp11"
"|pyr"
"|sel"
"|sony_news"
"|sparc"
"|sun"
"|tahoe"
"|tower"
"|u370"
"|u3b"
"|unix"
"|vax"
")";
sed = ":loop\n"
'/\\\\$/' "N\n"
's/\\\\$/\\\\+++fixinc_eol+++/' "\n"
'/\\\\$/' "b loop\n"
's/\\\\+++fixinc_eol+++/\\\\/g' "\n"
"/#[\t ]*[el]*if/ {\n"
"\ts/[a-zA-Z0-9_][a-zA-Z0-9_]*/ & /g\n"
"\ts/ M32 / __M32__ /g\n"
"\ts/ _*MIPSE\\([LB]\\) / __MIPSE\\1__ /g\n"
"\ts/ _*SYSTYPE_\\([A-Z0-9]*\\) / __SYSTYPE_\\1__ /g\n"
"\ts/ _*\\([Rr][34]\\)000 / __\\1000__ /g\n"
"\ts/ _*host_mips / __host_mips__ /g\n"
"\ts/ _*i386 / __i386__ /g\n"
"\ts/ _*mips / __mips__ /g\n"
"\ts/ bsd4\\([0-9]\\) / __bsd4\\1__ /g\n"
"\ts/ is68k / __is68k__ /g\n"
"\ts/ m68k / __m68k__ /g\n"
"\ts/ m88k / __m88k__ /g\n"
"\ts/ mc680\\([0-9]\\)0 / __mc680\\10__ /g\n"
"\ts/ news\\([0-9]*\\) / __news\\1__ /g\n"
"\ts/ ns32000 / __ns32000__ /g\n"
"\ts/ pdp11 / __pdp11__ /g\n"
"\ts/ pyr / __pyr__ /g\n"
"\ts/ sel / __sel__ /g\n"
"\ts/ sony_news / __sony_news__ /g\n"
"\ts/ sparc / __sparc__ /g\n"
"\ts/ sun\\([a-z0-9]*\\) / __sun\\1__ /g\n"
"\ts/ tahoe / __tahoe__ /g\n"
"\ts/ tower\\([_0-9]*\\) / __tower\\1__ /g\n"
"\ts/ u370 / __u370__ /g\n"
"\ts/ u3b\\([0-9]*\\) / __u3b\\1__ /g\n"
"\ts/ unix / __unix__ /g\n"
"\ts/ vax / __vax__ /g\n"
"\ts/ \\([a-zA-Z0-9_][a-zA-Z0-9_]*\\) /\\1/g\n\t}";
};
/*
* 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.
*/
fix = {
hackname = math_exception;
files = math.h;
select = "struct exception";
sed = "/struct exception/i\\\n"
"#ifdef __cplusplus\\\n"
"#define exception __math_exception\\\n"
"#endif\n";
sed = "/struct exception/a\\\n"
"#ifdef __cplusplus\\\n"
"#undef exception\\\n"
"#endif\n";
sed = "/matherr/i\\\n"
"#ifdef __cplusplus\\\n"
"#define exception __math_exception\\\n"
"#endif\n";
sed = "/matherr/a\\\n"
"#ifdef __cplusplus\\\n"
"#undef exception\\\n"
"#endif\n";
};
/*
* In math.h, put #ifndefs around things that might be defined
* in a gcc specific math-*.h file.
*/
fix = {
hackname = math_gcc_ifndefs;
files = math.h;
shell = " dbl_max_def="
"\"`egrep 'define[ \t]+DBL_MAX[ \t]+.*' ${SRCDIR}/float.h "
"2>/dev/null`\"\n\n"
"\tif ( test -n \"${dbl_max_def}\" \\\n"
"\t\t-a -n \"`egrep '#define[ \t]*HUGE_VAL[ \t]+DBL_MAX' $file`\" \\\n"
"\t\t-a -z \"`egrep '#define[ \t]+DBL_MAX[ \t]+' $file`\"\n"
"\t ) > /dev/null 2>&1\n"
"\tthen sed -e '/define[ \t]HUGE_VAL[ \t]/i\\\n"
"#ifndef HUGE_VAL\n' \\\n"
"\t-e '/define[ \t]HUGE_VAL[ \t]/a\\\n#endif\n'\\\n"
"\t-e \"/define[ \t]HUGE_VAL[ \t]DBL_MAX/s/DBL_MAX/$dbl_max_def/\"\n"
"\telse sed -e '/define[ \t]HUGE_VAL[ \t]/i\\\n"
"#ifndef HUGE_VAL\n' \\\n"
"\t-e '/define[ \t]HUGE_VAL[ \t]/a\\\n#endif\n'\n"
"\tfi";
};
/*
* libm.a on m88k-motorola-sysv3 contains a stupid optimization for
* function hypot(), which returns the second argument without even
* looking at its value
*/
fix = {
hackname = motorola_stupid_opt;
mach = "m88k-motorola-sysv3*";
files = math.h;
select = "^extern double hypot();$";
sed =
'/^extern double hypot();$/a' "\\\n"
'\/* Workaround a stupid Motorola optimization if one' "\\\n"
' of x or y is 0.0 and the other is negative! *\/' "\\\n"
'#ifdef __STDC__' "\\\n"
'static __inline__ double fake_hypot (double x, double y)' "\\\n"
'#else' "\\\n"
'static __inline__ double fake_hypot (x, y)' "\\\n"
"\tdouble x, y;\\\n"
'#endif' "\\\n"
'{' "\\\n"
"\treturn fabs (hypot (x, y));\\\n"
'}' "\\\n"
"#define hypot\tfake_hypot\n";
};
/*
* nested comment
*/
fix = {
hackname = nested_comment;
files = rpc/rpc.h;
sed = 's@^\(/\*.*rpc/auth_des.h>.*\)/\*@\1*/ /*@';
};
/*
* fix bogus recursive stdlib.h in NEWS-OS 4.0C
*/
fix = {
hackname = news_os_recursion;
files = stdlib.h;
select = "#include <stdlib.h>";
sed = "/^#include <stdlib.h>/i\\\n"
"#ifdef BOGUS_RECURSION\n";
sed = "/^#include <stdlib.h>/a\\\n"
"#endif\n";
};
/*
* NeXT 3.2 adds const prefix to some math functions.
* These conflict with the built-in functions.
*/
fix = {
hackname = next_math_prefix;
files = ansi/math.h;
select = "^extern.*double.*__const__.*";
sed = "/^extern.*double.*__const__.*sqrt(/s/__const__//";
sed = "/^extern.*double.*__const__.*fabs(/s/__const__//";
sed = "/^extern.*double.*__const__.*cos(/s/__const__//";
sed = "/^extern.*double.*__const__.*hypot(/s/__const__//";
sed = "/^extern.*double.*__const__.*sin(/s/__const__//";
};
/*
* NeXT 3.2 uses the word "template" as a parameter for some
* functions. GCC reports an invalid use of a reserved key word
* with the built-in functions. NeXT 3.2 includes the keyword
* volatile in the prototype for abort(). This conflicts with
* the built-in definition.
*/
fix = {
hackname = next_template;
files = bsd/libc.h;
select = template;
sed = '/\(.*template\)/s/template//';
sed = "/extern.*volatile.*void.*abort/s/volatile//";
};
/*
* NeXT 3.2 includes the keyword volatile in the abort() and exit()
* function prototypes. That conflicts with the built-in functions.
*/
fix = {
hackname = next_volitile;
files = ansi/stdlib.h;
select = volatile;
sed = "/extern.*volatile.*void.*exit/s/volatile//";
sed = "/extern.*volatile.*void.*abort/s/volatile//";
};
/*
* NeXT 2.0 defines 'int wait(union wait*)', which conflicts with Posix.1.
* Note that version 3 of the NeXT system has wait.h in a different directory,
* so that this code won't do anything. But wait.h in version 3 has a
* conditional, so it doesn't need this fix. So everything is okay.
*/
fix = {
hackname = next_wait_union;
files = sys/wait.h;
select = 'wait\(union wait';
sed = "s@wait(union wait@wait(void@";
};
/*
* a missing semi-colon at the end of the nodeent structure definition.
*/
fix = {
hackname = nodeent_syntax;
files = netdnet/dnetdb.h;
sed = "s/char.*na_addr *$/char *na_addr;/";
};
/*
* sys/lc_core.h on some versions of OSF1/4.x pollutes the namespace by
* defining regex.h related types. This causes libg++ build and usage
* failures. Fixing this correctly requires checking and modifying 3 files.
*/
fix = {
hackname = osf_namespace_a;
files = reg_types.h;
files = sys/lc_core.h;
test = "-r reg_types.h"
"-a -r sys/lc_core.h"
"-a -n \"`grep '} regex_t;' reg_types.h`\""
"-a -z \"`grep __regex_t regex.h`\"";
sed = "s/regex_t/__regex_t/g";
sed = "s/regoff_t/__regoff_t/g";
sed = "s/regmatch_t/__regmatch_t/g";
};
fix = {
hackname = osf_namespace_b;
files = regex.h;
test = "-r reg_types.h"
"-a -r sys/lc_core.h"
"-a -n \"`grep '} regex_t;' reg_types.h`\""
"-a -z \"`grep __regex_t regex.h`\"";
sed = "/#include <reg_types.h>/a\\\n"
"typedef __regex_t\tregex_t;\\\n"
"typedef __regoff_t\tregoff_t;\\\n"
"typedef __regmatch_t\tregmatch_t;\n";
};
/*
* Fix __page_size* declarations in pthread.h AIX 4.1.[34].
* The original ones fail if uninitialized externs are not common.
* This is the default for all ANSI standard C++ compilers.
*/
fix = {
hackname = pthread_page_size;
files = pthread.h;
select = "^int __page_size";
sed = "s/^int __page_size/extern int __page_size/";
};
/*
* Fix return type of fread and fwrite on sysV68
*/
#ifdef LATER
fix = {
hackname = read_ret_type;
files = stdio.h;
sed = "s/^\\(extern int\tfclose(), fflush()\\), "
"\\(fread(), fwrite()\\)\\(.*\\)$"
"/extern unsigned int\t\\2;\\\n\\1\\3/";
};
#endif
/*
* function class(double x) conflicts with C++ keyword on rs/6000
*/
fix = {
hackname = rs6000_double;
files = math.h;
select = '[^a-zA-Z_]class\(';
sed = "/class[(]/i\\\n#ifndef __cplusplus\n";
sed = "/class[(]/a\\\n#endif\n";
};
/*
* Wrong fchmod prototype on RS/6000.
*/
fix = {
hackname = rs6000_fchmod;
files = sys/stat.h;
select = 'fchmod\(char';
sed = 's/fchmod(char \*/fchmod(int/';
};
/*
* parameters conflict with C++ new on rs/6000
*/
fix = {
hackname = rs6000_param;
files = "stdio.h";
files = "unistd.h";
sed = 's@rename(const char \*old, const char \*new)@'
'rename(const char *_old, const char *_new)@';
};
/*
* Sony NEWSOS 5.0 does not support the complete ANSI C standard.
*/
#ifdef SONY
fix = {
hackname = sony_ctype;
files = ctype.h;
test = "-x /bin/sony";
test = "! -z \"`if /bin/sony ; then echo true ; fi`\"";
sed = "s/__ctype/_ctype/g";
};
#endif
/*
* Incorrect #include in Sony News-OS 3.2.
*/
fix = {
hackname = sony_include;
files = machine/machparam.h;
select = '"\.\./machine/endian.h"';
sed = 's@"../machine/endian.h"@<machine/endian.h>@';
};
/*
* Sony NEWSOS 5.0 does not support the complete ANSI C standard.
*/
#ifdef SONY
fix = {
hackname = sony_stdio;
files = stdio.h;
test = "-x /bin/sony";
test = "! -z \"`if /bin/sony ; then echo true ; fi`\"";
sed = "s/__filbuf/_filbuf/g\n"
"s/__flsbuf/_flsbuf/g\n"
"s/__iob/_iob/g";
};
#endif
/*
* Add a `static' declaration of `getrnge' into <regexp.h>.
*
* Don't do this if there is already a `static void getrnge' declaration
* present, since this would cause a redeclaration error. Solaris 2.x has
* such a declaration.
*/
#ifdef SVR4
fix = {
hackname = static_getrnge;
files = regexp.h;
bypass = "static void getrnge";
sed = "/^static int[ \t]*size;/c\\\n"
"static int size ;\\\n\\\n"
"static int getrnge ();";
};
#endif
/*
* a missing semi-colon at the end of the statsswtch structure definition.
*/
fix = {
hackname = statsswtch;
files = rpcsvc/rstat.h;
select = "boottime$";
sed = "s/boottime$/boottime;/";
};
/*
* 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.
* Arrange for stdio.h to use stdarg.h to define __gnuc_va_list
*/
fix = {
hackname = stdio_va_list;
files = stdio.h;
/*
* 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.
*/
shell =
"if ( egrep \"__need___va_list\" $file ) > /dev/null 2>&1 ; then
:
else
echo \"#define __need___va_list\"
echo \"#include <stdarg.h>\"
fi
sed -e 's@ va_list @ __gnuc_va_list @' \\
-e 's@ va_list)@ __gnuc_va_list)@' \\
-e 's@ _BSD_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@GNUC_VA_LIST@GNUC_Va_LIST@' \\
-e 's@_NEED___VA_LIST@_NEED___Va_LIST@' \\
-e 's@VA_LIST@DUMMY_VA_LIST@' \\
-e 's@_Va_LIST@_VA_LIST@'";
};
/*
* Check for strict ansi compliance
*/
#ifdef STRICT_ANSI
fix = {
hackname = strict_ansi;
select = "__STDC__[ \t]*[=!]=[ \t]*[01]";
sed = "s/__STDC__[ \t]*==[ \t]*0/!defined (__STRICT_ANSI__)/g";
sed = "s/__STDC__[ \t]*!=[ \t]*0/defined (__STRICT_ANSI__)/g";
sed = "s/__STDC__[ \t]*==[ \t]*1/defined (__STRICT_ANSI__)/g";
sed = "s/__STDC__[ \t]*!=[ \t]*1/!defined (__STRICT_ANSI__)/g";
};
#endif
/*
* Fix bogus #ifdef on SunOS 4.1.
*/
fix = {
hackname = sun_bogus_ifdef;
files = "hsfs/hsfs_spec.h";
files = "hsfs/iso_spec.h";
select = '#ifdef __i386__ || __vax__';
sed = "s/\\#ifdef __i386__ || __vax__/\\#if __i386__ || __vax__/g";
};
/*
* Fix bogus #ifdef on SunOS 4.1.
*/
fix = {
hackname = sun_bogus_ifdef_sun4c;
files = "hsfs/hsnode.h";
select = '#ifdef __i386__ || __sun4c__';
sed = "s/\\#ifdef __i386__ || __sun4c__/\\#if __i386__ || __sun4c__/g";
};
/*
* Fix the CAT macro in SunOS memvar.h.
*/
fix = {
hackname = sun_catmacro;
files = pixrect/memvar.h;
select = "^#define[ \t]+CAT(a,b)";
sed = "/^#define[ \t]CAT(a,b)/ i\\\n"
"#ifdef __STDC__ \\\n"
"#define CAT(a,b) a##b\\\n"
"#else\n";
sed = "/^#define[ \t]CAT(a,b)/ a\\\n"
"#endif\n";
};
/*
* Fix return type of free and {c,m,re}alloc in <malloc.h> on SunOS 4.1.
* Also fix return type of {m,re}alloc in <malloc.h> on sysV68
*/
fix = {
hackname = sun_malloc;
files = malloc.h;
sed = "s/typedef[ \t]char \\*\tmalloc_t/typedef void \\*\tmalloc_t/g";
sed = "s/int[ \t][ \t]*free/void\tfree/g";
sed = "s/char\\([ \t]*\\*[ \t]*malloc\\)/void\\1/g";
sed = "s/char\\([ \t]*\\*[ \t]*realloc\\)/void\\1/g";
};
/*
* Fix non-ANSI memcpy declaration that conflicts with gcc's builtin
* declaration on Sun OS 4.x. We must only fix this on Sun OS 4.x, because
* many other systems have similar text but correct versions of the file.
* To ensure only Sun's is fixed, we grep for a likely unique string.
* Fix also on sysV68 R3V7.1 (head/memory.h\t50.1\t )
*/
fix = {
hackname = sun_memcpy;
files = memory.h;
select = "/\\*\t@\\(#\\)"
"(head/memory.h\t50.1\t "
"|memory\\.h 1\\.[2-4] 8./../.. SMI; from S5R2 1\\.2\t)\\*/";
sed = "1i\\\n/* This file was generated by fixincludes */\\\n"
"#ifndef __memory_h__\\\n"
"#define __memory_h__\\\n\\\n"
"#ifdef __STDC__\\\n"
"extern void *memccpy();\\\n"
"extern void *memchr();\\\n"
"extern void *memcpy();\\\n"
"extern void *memset();\\\n"
"#else\\\n"
"extern char *memccpy();\\\n"
"extern char *memchr();\\\n"
"extern char *memcpy();\\\n"
"extern char *memset();\\\n"
"#endif /* __STDC__ */\\\n\\\n"
"extern int memcmp();\\\n\\\n"
"#endif /* __memory_h__ */\n";
sed = "1,$d";
};
/*
* Check for yet more missing ';' in struct (in SunOS 4.0.x)
*/
fix = {
hackname = sun_rusers_semi;
files = rpcsvc/rusers.h;
select = "_cnt$";
sed = "/^struct/,/^};/s/_cnt$/_cnt;/";
};
/*
* signal.h on SunOS defines signal using (),
* which causes trouble when compiling with g++ -pedantic.
*/
fix = {
hackname = sun_signal;
files = sys/signal.h;
files = signal.h;
select = "^void\t" '\(\*signal\(\)\)\(\);';
sed = "/^void\t" '(\*signal())();$/i' "\\\n"
"#ifdef __cplusplus" "\\\n"
"void\t(*signal(...))(...);" "\\\n"
"#else" "\n";
sed = "/^void\t" '(\*signal())();$/a' "\\\n"
'#endif' "\n";
};
/*
* On *some* SunOS-es, rpc/auth.h, rpc/clnt.h, rpc/svc.h, and
* rpc/xdr.h need prototypes for its ops function pointers.
*/
fix = {
hackname = sun_auth_proto;
files = rpc/auth.h;
files = rpc/clnt.h;
files = rpc/svc.h;
files = rpc/xdr.h;
mach = "*-sun-*";
/*
* Select those files containing '(*name)()' but *not*
* containing '(*name)(junk)'. The change would be innocuous
* but there is no point bothering if the fix is not needed.
*/
select = '\(\*[a-z][a-z_]*\)\(\)';
bypass = '\(\*[a-z][a-z_]*\)\(' "[ \t]*[a-zA-Z.].*" '\)';
sed = 's'
'/^\(.*(\*[a-z][a-z_]*)(\)' '\();.*\)'
"/\\\n"
"#ifdef __cplusplus\\\n"
'\1...\2' "\\\n"
"#else\\\n"
'\1\2' "\\\n"
"#endif"
"/";
};
/*
* This file on SunOS 4 has a very large macro. When the sed loop
* tries pull it in, it overflows the pattern space size of the SunOS
* sed (GNU sed does not have this problem). Since the file does not
* require fixing, we remove it from the fixed directory.
*/
fix = {
hackname = sunos_large_macro;
files = sundev/ipi_error.h;
shell =
"echo \"Removing incorrect fix to SunOS <sundev/ipi_error.h>\" >&2\n"
"rm -f ${DESTDIR}/$file ${DESTDIR}/$file.\ncat > /dev/null";
};
/*
* math.h on SunOS 4 puts the declaration of matherr before the definition
* of struct exception, so the prototype (added by fixproto) causes havoc.
*/
fix = {
hackname = sunos_matherr_decl;
files = math.h;
/*
* Find the first occurrance of 'struct exception'.
* If it is the definition, then the file is okay.
* If it is a usage, then the order is wrong and we
* must insert a forward reference.
*/
test = "\"`fgrep 'struct exception' $file | line`\""
" != 'struct exception {'";
sed = "/matherr/i\\\nstruct exception;\n";
};
/*
* Correct the return type for strlen in strings.h in SunOS 4.
*/
fix = {
hackname = sunos_strlen;
files = strings.h;
sed = "s/int[ \t]*strlen();/__SIZE_TYPE__ strlen();/";
};
/*
* Solaris math.h and floatingpoint.h define __P without protection,
* which conflicts with the fixproto definition. The fixproto
* definition and the Solaris definition are used the same way.
*/
#ifdef SVR4
fix = {
hackname = svr4__p;
files = math.h;
files = floatingpoint.h;
select = "^#define[ \t]*__P";
sed = "/^#define[ \t]*__P/i\\\n#ifndef __P\n";
sed = "/^#define[ \t]*__P/a\\\n#endif\n";
};
#endif
/*
* Disable apparent native compiler optimization cruft in SVR4.2 <string.h>
* that is visible to any ANSI compiler using this include. Simply
* delete the lines that #define some string functions to internal forms.
*/
#ifdef SVR4
fix = {
hackname = svr4_disable_opt;
files = string.h;
select = '#define.*__std_hdr_';
sed = '/#define.*__std_hdr_/d';
};
#endif
/*
* Conditionalize some of <sys/endian.h> on __GNUC__ and __GNUG__.
*/
#ifdef SVR4
fix = {
hackname = svr4_endian;
files = sys/endian.h;
bypass = '__GNUC__';
sed = "/#\tifdef\t__STDC__/i\\\n"
"# if !defined (__GNUC__) && !defined (__GNUG__)\n";
sed = "/#\t\tinclude\t<sys\\/byteorder.h>/s/\t\t/ /";
sed = "/# include\t<sys\\/byteorder.h>/i\\\n"
"# endif /* !defined (__GNUC__) && !defined (__GNUG__) */\n";
};
#endif
/*
* Remove useless extern keyword from struct forward declarations
* in <sys/stream.h> and <sys/strsubr.h>
*/
#ifdef SVR4
fix = {
hackname = svr4_extern_struct;
files = sys/stream.h;
files = sys/strsubr.h;
select = 'extern struct [a-z_]*;';
sed = 's/extern struct \([a-z][a-z_]*\)/struct \1/';
};
#endif
/*
* Fix declarations of `ftw' and `nftw' in <ftw.h>. On some/most SVR4
* systems the file <ftw.h> contains extern declarations of these
* functions followed by explicitly `static' definitions of these
* functions... and that's not allowed according to ANSI C. (Note
* however that on Solaris, this header file glitch has been pre-fixed by
* Sun. In the Solaris version of <ftw.h> there are no static
* definitions of any function so we don't need to do any of this stuff
* when on Solaris.
*/
#ifdef SVR4
#ifndef SOLARIS
fix = {
hackname = svr4_ftw;
files = ftw.h;
select = '^extern int ftw\(const';
sed = '/^extern int ftw(const/i' "\\\n"
"#if !defined(_STYPES)\\\n"
"static\\\n"
"#else\\\n"
"extern\\\n"
"#endif";
sed = 's/extern \(int ftw(const.*\)$/\1/';
sed = "/^extern int nftw/i\\\n"
"#if defined(_STYPES)\\\n"
"static\\\n"
"#else\\\n"
"extern\\\n"
"#endif";
sed = 's/extern \(int nftw.*\)$/\1/';
sed = "/^extern int ftw(),/c\\\n"
"#if !defined(_STYPES)\\\n"
"static\\\n"
"#else\\\n"
"extern\\\n"
"#endif\\\n"
" int ftw();\\\n"
"#if defined(_STYPES)\\\n"
"static\\\n"
"#else\\\n"
"extern\\\n"
"#endif\\\n"
" int nftw();";
};
#endif
#endif
/*
* Fix broken decl of getcwd present on some svr4 systems.
*/
#ifdef SVR4
fix = {
hackname = svr4_getcwd;
files = stdlib.h;
files = unistd.h;
select = 'getcwd\(char \*, int\)';
sed = 's/getcwd(char \*, int)/getcwd(char *, size_t)/';
};
#endif
/*
* set ifdef _KERNEL
*/
#ifdef SVR4
fix = {
hackname = svr4_kernel;
files = fs/rfs/rf_cache.h;
files = sys/erec.h;
files = sys/err.h;
files = sys/char.h;
files = sys/getpages.h;
files = sys/map.h;
files = sys/cmn_err.h;
files = sys/kdebugger.h;
bypass = '_KERNEL';
sed = "1i\\\n#ifdef _KERNEL";
sed = "$a\\\n#endif /* _KERNEL */";
};
#endif
/*
* Delete any #defines of `__i386' which may be present in <ieeefp.h>. They
* tend to conflict with the compiler's own definition of this symbol. (We
* will use the compiler's definition.)
* Likewise __sparc, for Solaris, and __i860, and a few others
* (guessing it is necessary for all of them).
*/
#ifdef SVR4
fix = {
hackname = svr4_mach_defines;
files = ieeefp.h;
select = "#define[ \t]*__(i386|i860|mips|sparc|m88k|m68k)[ \t]";
sed = "/#define[ \t]*__\\(i386|i860|mips|sparc|m88k|m68k\\)[ \t]/d";
};
#endif
/*
* Fix declarations of `makedev', `major', and `minor' in <sys/mkdev.h>.
*/
#ifdef SVR4
fix = {
hackname = svr4_mkdev;
files = sys/mkdev.h;
sed = "/^dev_t makedev(const/c\\\n"
"static dev_t makedev(const major_t, const minor_t);";
sed = "/^dev_t makedev()/c\\\n"
"static dev_t makedev();";
sed = "/^major_t major(const/c\\\n"
"static major_t major(const dev_t);";
sed = "/^major_t major()/c\\\n"
"static major_t major();";
sed = "/^minor_t minor(const/c\\\n"
"static minor_t minor(const dev_t);";
sed = "/^minor_t minor()/c\\\n"
"static minor_t minor();";
};
#endif
/*
* Fix reference to NC_NPI_RAW in <sys/netcspace.h>.
* Also fix types of array initializers.
*/
#ifdef SVR4
fix = {
hackname = svr4_netcspace;
files = sys/netcspace.h;
select = 'NC_NPI_RAW';
sed = 's/NC_NPI_RAW/NC_TPI_RAW/g';
sed = 's/NC_/(unsigned long) NC_/';
};
#endif
/*
* Fix reference to NMSZ in <sys/adv.h>.
*/
#ifdef SVR4
fix = {
hackname = svr4_nmsz;
files = sys/adv.h;
select = '\[NMSZ\]';
sed = 's/\[NMSZ\]/\[RFS_NMSZ\]/g';
};
#endif
/*
* Completely replace <sys/varargs.h> with a file that includes gcc's
* stdarg.h or varargs.h files as appropriate.
*/
#ifdef SVR4
fix = {
hackname = svr4_no_varargs;
files = sys/varargs.h;
shell = "cat > /dev/null\n"
"cat << _EOF_\n"
"/* This file was generated by fixincludes. */\n"
"#ifndef _SYS_VARARGS_H\n"
"#define _SYS_VARARGS_H\n\n"
"#ifdef __STDC__\n"
"#include <stdarg.h>\n"
"#else\n"
"#include <varargs.h>\n"
"#endif\n\n"
"#endif /* _SYS_VARARGS_H */\n"
"_EOF_";
};
#endif
/*
* Fix broken decl of profil present on some svr4 systems.
*/
#ifdef SVR4
fix = {
hackname = svr4_profil;
files = stdlib.h;
files = unistd.h;
sed = 's/profil(unsigned short \*, unsigned int, '
'unsigned int, unsigned int)'
'/profil(unsigned short *, size_t, int, unsigned)/';
};
#endif
/*
* Convert functions to prototype form, and fix arg names in <sys/stat.h>.
*/
#ifdef SVR4
fix = {
hackname = svr4_proto_form;
files = sys/stat.h;
select = 'const extern';
sed = "/^stat([ \t]*[^c]/ {\nN\nN\n"
"s/(.*)\\n/( /\n"
"s/;\\n/, /\n"
"s/;$/)/\n" "}";
sed = "/^lstat([ \t]*[^c]/ {\nN\nN\n"
"s/(.*)\\n/( /\n"
"s/;\\n/, /\n"
"s/;$/)/\n" "}";
sed = "/^fstat([ \t]*[^i]/ {\nN\nN\n"
"s/(.*)\\n/( /\n"
"s/;\\n/, /\n"
"s/;$/)/\n" "}";
sed = "/^mknod([ \t]*[^c]/{\nN\nN\nN\n"
"s/(.*)\\n/( /\n"
"s/;\\n/, /g\n"
"s/;$/)/\n" "}";
sed = "1,$s/\\([^A-Za-z]\\)path\\([^A-Za-z]\\)/\\1__path\\2/g";
sed = "1,$s/\\([^A-Za-z]\\)buf\\([^A-Za-z]\\)/\\1__buf\\2/g";
sed = "1,$s/\\([^A-Za-z]\\)fd\\([^A-Za-z]\\)/\\1__fd\\2/g";
sed = "1,$s/ret\\([^u]\\)/__ret\\1/g";
sed = "1,$s/\\([^_]\\)mode\\([^_]\\)/\\1__mode\\2/g";
sed = "1,$s/\\([^_r]\\)dev\\([^_]\\)/\\1__dev\\2/g";
};
#endif
/*
* Add a prototyped declaration of mmap to <sys/mman.h>.
*/
#ifdef SVR4
fix = {
hackname = svr4_proto_mmap;
files = sys/mman.h;
select = '^extern caddr_t mmap();$';
sed = '/^extern caddr_t mmap();$/c' "\\\n"
"#ifdef __STDC__\\\n"
"extern caddr_t mmap (caddr_t, size_t, int, int, int, off_t);\\\n"
"#else /* !defined(__STDC__) */\\\n"
"extern caddr_t mmap ();\\\n"
"#endif /* !defined(__STDC__) */\\\n";
};
#endif
/*
* Add a #define of _SIGACTION_ into <sys/signal.h>.
*/
#ifdef SVR4
fix = {
hackname = svr4_sigaction;
files = sys/signal.h;
sed = "/^struct sigaction {/i\\\n"
"#define _SIGACTION_";
sed = 's/(void *(\*)())/(void (*)(int))/';
};
#endif
/*
* Put storage class at start of decl, to avoid warning.
*/
#ifdef SVR4
fix = {
hackname = svr4_storage_class;
files = rpc/types.h;
select = 'const extern';
sed = 's/const extern/extern const/g';
};
#endif
/*
* Fix return value of mem{ccpy,chr,cpy,set} and str{len,spn,cspn}
* in string.h on sysV68
* Correct the return type for strlen in string.h on Lynx.
* Correct the argument type for ffs in string.h on Alpha OSF/1 V2.0.
* Add missing const for strdup on OSF/1 V3.0.
* On sysV88 layout is slightly different.
*/
fix = {
hackname = systypes;
files = "sys/types.h";
files = "stdlib.h";
files = "sys/stdtypes.h";
files = "stddef.h";
files = "memory.h";
files = "unistd.h";
select = "typedef[ \t]+[a-z_][ \ta-z_]*[ \t]"
"(size|ptrdiff|wchar)_t";
sed = "/^[ \t]*\\*[ \t]*typedef unsigned int size_t;/N";
sed = "s/^\\([ \t]*\\*[ \t]*typedef unsigned int size_t;\\n"
"[ \t]*\\*\\/\\)/\\1\\\n"
"#ifndef __SIZE_TYPE__\\\n"
"#define __SIZE_TYPE__ long unsigned int\\\n"
"#endif\\\n"
"typedef __SIZE_TYPE__ size_t;\\\n/";
sed = "/typedef[ \t][ \t]*[a-z_][ \ta-z_]*[ \t]size_t/i\\\n"
"#ifndef __SIZE_TYPE__\\\n"
"#define __SIZE_TYPE__ long unsigned int\\\n"
"#endif\n";
sed = "s/typedef[ \t][ \t]*[a-z_][ \ta-z_]*[ \t]size_t/"
"typedef __SIZE_TYPE__ size_t/";
sed = "/typedef[ \t][ \t]*[a-z_][ \ta-z_]*[ \t]ptrdiff_t/i\\\n"
"#ifndef __PTRDIFF_TYPE__\\\n"
"#define __PTRDIFF_TYPE__ long int\\\n"
"#endif\n";
sed = "s/typedef[ \t][ \t]*[a-z_][ \ta-z_]*[ \t]ptrdiff_t/"
"typedef __PTRDIFF_TYPE__ ptrdiff_t/";
sed = "/typedef[ \t][ \t]*[a-z_][ \ta-z_]*[ \t]wchar_t/i\\\n"
"#ifndef __WCHAR_TYPE__\\\n"
"#define __WCHAR_TYPE__ int\\\n"
"#endif\\\n"
"#ifndef __cplusplus\n";
sed = "/typedef[ \t][ \t]*[a-z_][ \ta-z_]*[ \t]wchar_t/a\\\n"
"#endif\n";
sed = "s/typedef[ \t][ \t]*[a-z_][ \ta-z_]*[ \t]wchar_t/"
"typedef __WCHAR_TYPE__ wchar_t/";
};
/*
* Fix return type of exit and abort in <stdlib.h> on SunOS 4.1.
* Also wrap protection around size_t for m88k-sysv3 systems.
* We use a funny name to ensure it follows 'systypes' fix.
*/
fix = {
hackname = systypes_for_aix;
files = sys/types.h;
select = "typedef[ \t][ \t]*[A-Za-z_][ \tA-Za-z_]*[ \t]size_t";
bypass = "_GCC_SIZE_T";
sed = "/typedef[ \t][ \t]*[A-Za-z_][ \tA-Za-z_]*[ \t]size_t/i\\\n"
"#ifndef _GCC_SIZE_T\\\n"
"#define _GCC_SIZE_T\n";
sed = "/typedef[ \t][ \t]*[A-Za-z_][ \tA-Za-z_]*[ \t]size_t/a\\\n"
"#endif\n";
};
/*
* if the #if says _cplusplus, not the double underscore __cplusplus
* that it should be
*/
fix = {
hackname = sysv68_string;
files = string.h;
sed = "s/extern[ \t]*int[ \t]*strlen();/extern unsigned int strlen();/";
sed = "s/extern[ \t]*int[ \t]*ffs[ \t]*(long);/extern int ffs(int);/";
sed = "s/strdup(char \\*s1);/strdup(const char *s1);/";
sed = "/^extern char$/N";
sed = "s/^extern char\\(\\n\t\\*memccpy(),\\)$/extern void\\1/";
sed = "/^\tstrncmp(),$/N";
sed = "s/^\\(\tstrncmp()\\),\\n\\(\tstrlen(),\\)$/\\1;\\\n"
"extern unsigned int\\\n\\2/";
sed = "/^extern int$/N";
sed = "s/^extern int\\(\\n\tstrlen(),\\)/extern size_t\\1/";
};
/*
* Replace definitions of size_t, ptrdiff_t and wchar_t
* Install the proper definition of the three standard types
* in header files that they come from.
*/
fix = {
hackname = sysz_stdlib_for_sun;
mach = "*-sun-*";
mach = "m88k-*-sysv3*";
files = stdlib.h;
sed = "s/int\tabort/void\tabort/g";
sed = "s/int\tfree/void\tfree/g";
sed = "s/char[ \t]*\\*[ \t]*calloc/void \\*\tcalloc/g";
sed = "s/char[ \t]*\\*[ \t]*malloc/void \\*\tmalloc/g";
sed = "s/char[ \t]*\\*[ \t]*realloc/void \\*\trealloc/g";
sed = "s/int[ \t][ \t]*exit/void\texit/g";
sed = "/typedef[ \ta-zA-Z_]*[ \t]size_t[ \t]*;/i\\\n"
"#ifndef _GCC_SIZE_T\\\n"
"#define _GCC_SIZE_T\n";
sed = "/typedef[ \ta-zA-Z_]*[ \t]size_t[ \t]*;/a\\\n"
"#endif\n";
};
/*
* Fix this Sun file to avoid interfering with stddef.h.
* We use a funny name to ensure it follows 'systypes' fix.
*/
fix = {
hackname = sysz_stdtypes_for_sun;
files = sys/stdtypes.h;
sed = "/[\t ]size_t.*;/i\\\n"
"#ifndef _GCC_SIZE_T\\\n"
"#define _GCC_SIZE_T\n";
sed = "/[\t ]size_t.*;/a\\\n"
"#endif\n";
sed = "/[\t ]ptrdiff_t.*;/i\\\n"
"#ifndef _GCC_PTRDIFF_T\\\n"
"#define _GCC_PTRDIFF_T\n";
sed = "/[\t ]ptrdiff_t.*;/a\\\n"
"#endif\n";
sed = "/[\t ]wchar_t.*;/i\\\n"
"#ifndef _GCC_WCHAR_T\\\n"
"#define _GCC_WCHAR_T\n";
sed = "/[\t ]wchar_t.*;/a\\\n"
"#endif\n";
};
/*
* Fix this file to avoid interfering with stddef.h,
* but don't mistakenly match ssize_t present in AIX for the ps/2,
* or typedefs which use (but do not set) size_t.
*/
fix = {
hackname = tinfo_cplusplus;
files = tinfo.h;
sed = "s/[ \t]_cplusplus/ __cplusplus/";
};
/*
* Cancel out ansi_compat.h on Ultrix. Replace it with empty file.
*/
fix = {
hackname = ultrix_ansi_compat;
files = ansi_compat.h;
select = ULTRIX;
sed = "1i\\\n/* This file intentionally left blank. */\n";
sed = "1,$d";
};
/*
* parameter to atof not const on DECstation Ultrix V4.0 and NEWS-OS 4.2R.
* also get rid of bogus inline definitions in HP-UX 8.0
*/
fix = {
hackname = ultrix_atof_param;
files = math.h;
sed = "s@atof(\\([ \t]*char[ \t]*\\*[^)]*\\))@atof(const \\1)@";
sed = "s@inline int abs(int [a-z][a-z]*) {.*}@extern \"C\" int abs(int);@";
sed = "s@inline double abs(double [a-z][a-z]*) {.*}@@";
sed = "s@inline int sqr(int [a-z][a-z]*) {.*}@@";
sed = "s@inline double sqr(double [a-z][a-z]*) {.*}@@";
};
/*
* parameters not const on DECstation Ultrix V4.0 and OSF/1.
*/
fix = {
hackname = ultrix_const;
files = stdio.h;
sed = 's@perror( char \*__s );@perror( const char *__s );@';
sed = 's@fputs( char \*__s,@fputs( const char *__s,@';
sed = 's@fopen( char \*__filename, char \*__type );@'
'fopen( const char *__filename, const char *__type );@';
sed = 's@fwrite( void \*__ptr,@fwrite( const void *__ptr,@';
sed = 's@fscanf( FILE \*__stream, char \*__format,@'
'fscanf( FILE *__stream, const char *__format,@';
sed = 's@scanf( char \*__format,@scanf( const char *__format,@';
sed = 's@sscanf( char \*__s, char \*__format,@'
'sscanf( const char *__s, const char *__format,@';
sed = 's@popen(char \*, char \*);@popen(const char *, const char *);@';
sed = 's@tempnam(char\*,char\*);@tempnam(const char*,const char*);@';
};
/*
* Check for bad #ifdef line (in Ultrix 4.1)
*/
fix = {
hackname = ultrix_ifdef;
select = "#ifdef KERNEL";
files = sys/file.h;
sed = "s/#ifdef KERNEL/#if defined(KERNEL)/";
};
/*
* Avoid nested comments on Ultrix 4.3.
*/
fix = {
hackname = ultrix_nested_cmnt;
files = rpc/svc.h;
sed = "s@^\\( \\*\tint protocol; \\)/\\*@\\1*/ /*@";
};
/*
* Check for superfluous `static' (in Ultrix 4.2)
* On Ultrix 4.3, includes of other files (r3_cpu.h,r4_cpu.h) is broken.
*/
fix = {
hackname = ultrix_static;
files = machine/cpu.h;
select = '#include "r[34]_cpu';
sed = "s/^static struct tlb_pid_state/struct tlb_pid_state/";
sed = 's/^#include "r3_cpu\.h"$/#include <machine\/r3_cpu\.h>/';
sed = 's/^#include "r4_cpu\.h"$/#include <machine\/r4_cpu\.h>/';
};
/*
* Fix multiple defines for NULL
*/
fix = {
hackname = undefine_null;
select = "^#[ \t]*define[ \t]*[ \t]NULL[ \t]";
bypass = "#[ \t]*(ifn|un)def[ \t]*[ \t]NULL($|[ \t])";
sed = "/^#[ \t]*define[ \t][ \t]*NULL[ \t]/i\\\n"
"#undef NULL\n";
};
/*
* Fix definitions of macros used by va-i960.h in VxWorks header file.
*/
fix = {
hackname = va_i960_macro;
files = arch/i960/archI960.h;
select = "__(vsiz|vali|vpad|alignof__)";
sed = "s/__vsiz/__vxvsiz/";
sed = "s/__vali/__vxvali/";
sed = "s/__vpad/__vxvpad/";
sed = "s/__alignof__/__vxalignof__/";
};
/*
* AIX headers define NULL to be cast to a void pointer,
* which is illegal in ANSI C++.
*/
fix = {
hackname = void_null;
files = curses.h;
files = dbm.h;
files = locale.h;
files = stdio.h;
files = stdlib.h;
files = string.h;
files = time.h;
files = unistd.h;
files = sys/dir.h;
files = sys/param.h;
files = sys/types.h;
select = "#[ \t]*define[ \t][ \t]*NULL[ \t].*void";
sed = "s/^#[ \t]*define[ \t]*NULL[ \t]*((void[ \t]*\\*)0)"
"/#define NULL 0/";
};
/*
* Make VxWorks header which is almost gcc ready fully gcc ready.
*/
fix = {
hackname = vxworks_gcc_problem;
files = types/vxTypesBase.h;
select = "__GNUC_TYPEOF_FEATURE_BROKEN_USE_DEFAULT_UNTIL_FIXED__";
sed = "s/#ifdef __GNUC_TYPEOF_FEATURE_BROKEN_USE_DEFAULT_UNTIL_FIXED__/"
"#if 1/";
sed = "/[ \t]size_t/i\\\n"
"#ifndef _GCC_SIZE_T\\\n"
"#define _GCC_SIZE_T\n";
sed = "/[ \t]size_t/a\\\n"
"#endif\n";
sed = "/[ \t]ptrdiff_t/i\\\n"
"#ifndef _GCC_PTRDIFF_T\\\n"
"#define _GCC_PTRDIFF_T\n";
sed = "/[ \t]ptrdiff_t/a\\\n"
"#endif\n";
sed = "/[ \t]wchar_t/i\\\n"
"#ifndef _GCC_WCHAR_T\\\n"
"#define _GCC_WCHAR_T\n";
sed = "/[ \t]wchar_t/a\\\n"
"#endif\n";
};
/*
* Fix VxWorks <time.h> to not require including <vxTypes.h>.
*/
fix = {
hackname = vxworks_needs_vxtypes;
files = time.h;
select = "uint_t[ \t][ \t]*_clocks_per_sec";
sed = "s/uint_t/unsigned int/";
};
/*
* Fix VxWorks <sys/stat.h> to not require including <vxWorks.h>.
*/
fix = {
hackname = vxworks_needs_vxworks;
files = sys/stat.h;
test = "-r types/vxTypesOld.h";
test = "-n \"`fgrep '#include' $file`\"";
test = "-n \"`fgrep ULONG $file`\"";
select = "#[ \t]define[ \t][ \t]*__INCstath";
sed = "/#[ \t]define[ \t][ \t]*__INCstath/a\\\n"
"#include <types/vxTypesOld.h>\n";
};
/*
* Another bad dependency in VxWorks 5.2 <time.h>.
*/
fix = {
hackname = vxworks_time;
files = time.h;
select = "VOIDFUNCPTR";
test = "-r vxWorks.h";
sed = "/VOIDFUNCPTR/i\\\n"
"#ifndef __gcc_VOIDFUNCPTR_defined\\\n"
"#ifdef __cplusplus\\\n"
"typedef void (*__gcc_VOIDFUNCPTR) (...);\\\n"
"#else\\\n"
"typedef void (*__gcc_VOIDFUNCPTR) ();\\\n"
"#endif\\\n"
"#define __gcc_VOIDFUNCPTR_defined\\\n"
"#endif\n";
sed = "s/VOIDFUNCPTR/__gcc_VOIDFUNCPTR/g";
};
/*
* There are several name conflicts with C++ reserved words in X11 header
* files. These are fixed in some versions, so don't do the fixes if
* we find __cplusplus in the file. These were found on the RS/6000.
*/
fix = {
hackname = x11_class;
files = X11/ShellP.h;
bypass = __cplusplus;
sed = "/char \\*class;/i\\\n"
"#ifdef __cplusplus\\\n"
"\tchar *c_class;\\\n"
"#else\n";
sed = "/char \\*class;/a\\\n"
"#endif\n";
};
/*
* class in Xm/BaseClassI.h
*/
fix = {
hackname = x11_class_usage;
files = Xm/BaseClassI.h;
bypass = "__cplusplus";
sed = "s/ class[)]/ c_class)/g";
};
/*
* new in Xm/Traversal.h
*/
fix = {
hackname = x11_new;
files = Xm/Traversal.h;
bypass = __cplusplus;
sed = "/Widget\told, new;/i\\\n"
"#ifdef __cplusplus\\\n"
"\tWidget\told, c_new;\\\n"
"#else\n";
sed = "/Widget\told, new;/a\\\n"
"#endif\n";
sed = "s/Widget new,/Widget c_new,/g";
};
/*
* Incorrect sprintf declaration in X11/Xmu.h
*/
fix = {
hackname = x11_sprintf;
files = X11*/Xmu.h;
sed = "s,^extern char \\*\tsprintf();$,#ifndef __STDC__\\\n"
"extern char *\tsprintf();\\\n"
"#endif /* !defined __STDC__ */,";
};
/*
* Purge some HP-UX 11 files that are only borken after they are "fixed".
*/
fix = {
hackname = zzz_ki_iface;
files = sys/ki_iface.h;
select = 'These definitions are for HP Internal developers';
shell =
"echo \"Removing incorrect fix to HP-UX <$file>\" >&2\n"
"rm -f ${DESTDIR}/$file ${DESTDIR}/$file.\ncat > /dev/null";
};
/*
* Purge some HP-UX 11 files that are only borken after they are "fixed".
*/
fix = {
hackname = zzz_ki;
files = sys/ki.h;
select = '11.00 HP-UX LP64';
shell =
"echo \"Removing incorrect fix to HP-UX <$file>\" >&2\n"
"rm -f ${DESTDIR}/$file ${DESTDIR}/$file.\ncat > /dev/null";
};
/*
* Purge some HP-UX 11 files that are only borken after they are "fixed".
*/
fix = {
hackname = zzz_ki_calls;
files = sys/ki_calls.h;
select = 'KI_MAX_PROCS is an arbitrary number';
shell =
"echo \"Removing incorrect fix to HP-UX <$file>\" >&2\n"
"rm -f ${DESTDIR}/$file ${DESTDIR}/$file.\ncat > /dev/null";
};
/*
* Purge some HP-UX 11 files that are only borken after they are "fixed".
*/
fix = {
hackname = zzz_ki_defs;
files = sys/ki_defs.h;
select = 'Kernel Instrumentation Definitions';
shell =
"echo \"Removing incorrect fix to HP-UX <$file>\" >&2\n"
"rm -f ${DESTDIR}/$file ${DESTDIR}/$file.\ncat > /dev/null";
};
/*
* Purge some HP-UX 11 files that are only borken after they are "fixed".
*/
fix = {
hackname = zzz_time;
files = sys/time.h;
select = 'For CASPEC, look in';
shell =
"echo \"Removing incorrect fix to HP-UX <$file>\" >&2\n"
"rm -f ${DESTDIR}/$file ${DESTDIR}/$file.\ncat > /dev/null";
};
/*EOF*/
[= 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=]
#! /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 ..
This source diff could not be displayed because it is too large. You can view the blob instead.
/* 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:
*/
/*
* $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( &currentAction.sa_mask );
sigaction( SIGPIPE, &currentAction, &savePipeAction );
sigaction( SIGALRM, &currentAction, &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;
}
}
/*
* $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 */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment