mirror of
https://github.com/pret/agbcc.git
synced 2026-07-19 00:31:35 -05:00
remove fixinc, protoize, and gcov
This commit is contained in:
parent
b5fb6c8ffb
commit
a38b952671
333
gcc/Makefile.in
333
gcc/Makefile.in
|
|
@ -19,7 +19,7 @@
|
|||
#Boston MA 02111-1307, USA.
|
||||
|
||||
# The targets for external use include:
|
||||
# all, doc, proto, install, install-cross, install-cross-rest,
|
||||
# all, doc, install, install-cross, install-cross-rest,
|
||||
# uninstall, TAGS, mostlyclean, clean, distclean, maintainer-clean,
|
||||
# stage1, stage2, stage3, stage4.
|
||||
|
||||
|
|
@ -40,7 +40,7 @@ SUBDIRS =@subdirs@
|
|||
# Selection of languages to be made.
|
||||
# This is overridden by configure.
|
||||
CONFIG_LANGUAGES = @all_languages@
|
||||
LANGUAGES = c proto gcov$(exeext) $(CONFIG_LANGUAGES)
|
||||
LANGUAGES = c $(CONFIG_LANGUAGES)
|
||||
|
||||
# Selection of languages to be made during stage1 build.
|
||||
# This is overridden by configure.
|
||||
|
|
@ -216,9 +216,6 @@ RANLIB_TEST_FOR_TARGET = \
|
|||
# Dir to search for system headers. Overridden by cross-make.
|
||||
SYSTEM_HEADER_DIR = /usr/include
|
||||
|
||||
# Control whether to run fixproto.
|
||||
STMP_FIXPROTO = stmp-fixproto
|
||||
|
||||
# Test to see whether <limits.h> exists in the system header files.
|
||||
LIMITS_H_TEST = [ -f $(SYSTEM_HEADER_DIR)/limits.h ]
|
||||
|
||||
|
|
@ -393,18 +390,6 @@ INSTALL_HEADERS=install-headers
|
|||
# Options for tar when copying trees. So HPUX can override it.
|
||||
TAROUTOPTS = xpBf
|
||||
|
||||
# Select which version of fixincludes to use (I.E. regular versus SVR4)
|
||||
# This value is overridden directly by configure.
|
||||
FIXINCLUDES = @fixincludes@
|
||||
|
||||
# Additional directories of header files to run fixincludes on.
|
||||
# These should be directories searched automatically by default
|
||||
# just as /usr/include is.
|
||||
# *Do not* use this for directories that happen to contain
|
||||
# header files, but are not searched automatically by default.
|
||||
# On most systems, this is empty.
|
||||
OTHER_FIXINCLUDES_DIRS=
|
||||
|
||||
# A list of all the language-specific executables.
|
||||
# This is overridden by configure.
|
||||
COMPILERS = cc1$(exeext) @all_compilers@
|
||||
|
|
@ -446,13 +431,9 @@ HOST_DOPRINT=$(DOPRINT)
|
|||
|
||||
# Actual name to use when installing a native compiler.
|
||||
GCC_INSTALL_NAME = `t='$(program_transform_name)'; echo gcc | sed -e $$t`
|
||||
PROTOIZE_INSTALL_NAME = `t='$(program_transform_name)'; echo protoize | sed -e $$t`
|
||||
UNPROTOIZE_INSTALL_NAME = `t='$(program_transform_name)'; echo unprotoize | sed -e $$t`
|
||||
|
||||
# Actual name to use when installing a cross-compiler.
|
||||
GCC_CROSS_NAME = `t='$(program_transform_cross_name)'; echo gcc | sed -e $$t`
|
||||
PROTOIZE_CROSS_NAME = `t='$(program_transform_cross_name)'; echo protoize | sed -e $$t`
|
||||
UNPROTOIZE_CROSS_NAME = `t='$(program_transform_cross_name)'; echo unprotoize | sed -e $$t`
|
||||
|
||||
# Choose the real default target.
|
||||
ALL=all.internal
|
||||
|
|
@ -470,9 +451,6 @@ RUNTEST = `if [ -f $${srcdir}/../dejagnu/runtest ] ; then \
|
|||
else echo runtest; fi`
|
||||
RUNTESTFLAGS =
|
||||
|
||||
# Extra symbols for fixproto to define when parsing headers.
|
||||
FIXPROTO_DEFINES =
|
||||
|
||||
# End of variables for you to override.
|
||||
|
||||
# Definition of `all' is here so that new rules inserted by sed
|
||||
|
|
@ -660,9 +638,7 @@ STAGESTUFF = *$(objext) insn-flags.h insn-config.h insn-codes.h \
|
|||
xgcc$(exeext) cc1$(exeext) cpp$(exeext) $(EXTRA_PASSES) \
|
||||
$(EXTRA_PROGRAMS) gcc-cross$(exeext) \
|
||||
$(CCCP)$(exeext) cc1obj$(exeext) enquire$(exeext) \
|
||||
protoize$(exeext) unprotoize$(exeext) \
|
||||
specs underscore.c \
|
||||
gcov$(exeext) *.bp \
|
||||
$(CYGNUS-LOCAL-range) *.range \
|
||||
*.greg *.lreg *.combine *.flow *.cse *.jump *.rtl *.tree *.loop \
|
||||
*.dbr *.jump2 *.sched *.cse2 *.sched2 *.stack *.gcse \
|
||||
|
|
@ -797,14 +773,14 @@ all.internal: start.encap rest.encap
|
|||
# This is what to compile if making a cross-compiler.
|
||||
# Note that we can compile enquire using the cross-compiler just built,
|
||||
# although we can't run it on this machine.
|
||||
all.cross: native gcc-cross specs stmp-headers $(STMP_FIXPROTO) $(LIBGCC) \
|
||||
all.cross: native gcc-cross specs stmp-headers $(LIBGCC) \
|
||||
$(LIBGCC1_TEST) lang.all.cross
|
||||
# This is what to compile if making gcc with a cross-compiler.
|
||||
all.build: native xgcc$(exeext) lang.all.build
|
||||
# This is what must be made before installing GCC and converting libraries.
|
||||
start.encap: native xgcc$(exeext) specs $(LIBGCC1) xlimits.h lang.start.encap
|
||||
# These can't be made until after GCC can run.
|
||||
rest.encap: stmp-headers $(STMP_FIXPROTO) $(LIBGCC) lang.rest.encap
|
||||
rest.encap: stmp-headers $(LIBGCC) lang.rest.encap
|
||||
# This is what is made with the host's compiler
|
||||
# whether making a cross compiler or not.
|
||||
native: config.status auto-host.h cpp$(exeext) $(LANGUAGES) \
|
||||
|
|
@ -812,10 +788,9 @@ native: config.status auto-host.h cpp$(exeext) $(LANGUAGES) \
|
|||
|
||||
# Define the names for selecting languages in LANGUAGES.
|
||||
C c: cc1$(exeext)
|
||||
PROTO: proto
|
||||
|
||||
# Tell GNU make these are phony targets.
|
||||
.PHONY: C c PROTO proto
|
||||
.PHONY: C c
|
||||
|
||||
# On the target machine, finish building a cross compiler.
|
||||
# This does the things that can't be done on the host machine.
|
||||
|
|
@ -997,7 +972,7 @@ libgcc1.S: libgcc1.c $(CONFIG_H) config.status
|
|||
# Compiling libgcc2.a requires making sure that cc1, etc. have been compiled.
|
||||
# But recompiling cc1 should not force recompilation of libgcc2.a.
|
||||
# If you want to force recompilation, delete libgcc2.a.
|
||||
libgcc2.ready: $(GCC_PASSES) $(LIBGCC2_DEPS) stmp-int-hdrs $(STMP_FIXPROTO)
|
||||
libgcc2.ready: $(GCC_PASSES) $(LIBGCC2_DEPS) stmp-int-hdrs
|
||||
-if [ -f libgcc2.ready ] ; then \
|
||||
true; \
|
||||
else \
|
||||
|
|
@ -1443,7 +1418,7 @@ resource.o : resource.c $(CONFIG_H) $(RTL_H) hard-reg-set.h system.h \
|
|||
lcm.o : lcm.c $(CONFIG_H) system.h $(RTL_H) $(REGS_H) hard-reg-set.h flags.h \
|
||||
real.h insn-config.h $(RECOG_H) $(EXPR_H) $(BASIC_BLOCK_H)
|
||||
profile.o : profile.c $(CONFIG_H) system.h $(RTL_H) flags.h insn-flags.h \
|
||||
gcov-io.h $(TREE_H) output.h $(REGS_H) toplev.h insn-config.h
|
||||
$(TREE_H) output.h $(REGS_H) toplev.h insn-config.h
|
||||
loop.o : loop.c $(CONFIG_H) system.h $(RTL_H) flags.h loop.h insn-config.h \
|
||||
insn-flags.h $(REGS_H) hard-reg-set.h $(RECOG_H) $(EXPR_H) real.h \
|
||||
toplev.h varray.h
|
||||
|
|
@ -1829,7 +1804,7 @@ $(HOST_PREFIX_1):
|
|||
touch $(HOST_PREFIX_1)
|
||||
|
||||
#
|
||||
# Remake cpp and protoize.
|
||||
# Remake cpp.
|
||||
|
||||
# Making the preprocessor
|
||||
cpp$(exeext): $(CCCP)$(exeext)
|
||||
|
|
@ -1897,42 +1872,6 @@ cppalloc.o: cppalloc.c $(CONFIG_H) cpplib.h machmode.h system.h
|
|||
# Note for the stamp targets, we run the program `true' instead of
|
||||
# having an empty command (nothing following the semicolon).
|
||||
|
||||
proto: config.status protoize$(exeext) unprotoize$(exeext) SYSCALLS.c.X
|
||||
|
||||
protoize$(exeext): protoize.o getopt.o getopt1.o getpwd.o version.o \
|
||||
pexecute.o choose-temp.o mkstemp.o $(LIBDEPS)
|
||||
$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \
|
||||
protoize.o getopt.o getopt1.o getpwd.o version.o \
|
||||
pexecute.o choose-temp.o mkstemp.o $(LIBS)
|
||||
|
||||
unprotoize$(exeext): unprotoize.o getopt.o getopt1.o getpwd.o version.o \
|
||||
pexecute.o choose-temp.o mkstemp.o $(LIBDEPS)
|
||||
$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \
|
||||
unprotoize.o getopt.o getopt1.o getpwd.o version.o \
|
||||
pexecute.o choose-temp.o mkstemp.o $(LIBS)
|
||||
|
||||
protoize.o: protoize.c $(srcdir)/../include/getopt.h $(CONFIG_H) system.h \
|
||||
Makefile
|
||||
$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
|
||||
-DGCC_INCLUDE_DIR=\"$(libsubdir)/include\" \
|
||||
-DGPLUSPLUS_INCLUDE_DIR=\"$(gcc_gxx_include_dir)\" \
|
||||
-DCROSS_INCLUDE_DIR=\"$(gcc_tooldir)/sys-include\" \
|
||||
-DTOOL_INCLUDE_DIR=\"$(gcc_tooldir)/include\" \
|
||||
-DLOCAL_INCLUDE_DIR=\"$(includedir)\" \
|
||||
-DSTD_PROTO_DIR=\"$(libsubdir)\" \
|
||||
$(srcdir)/protoize.c
|
||||
|
||||
unprotoize.o: unprotoize.c protoize.c $(srcdir)/../include/getopt.h \
|
||||
$(CONFIG_H) system.h Makefile
|
||||
$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
|
||||
-DGCC_INCLUDE_DIR=\"$(libsubdir)/include\" \
|
||||
-DGPLUSPLUS_INCLUDE_DIR=\"$(gcc_gxx_include_dir)\" \
|
||||
-DCROSS_INCLUDE_DIR=\"$(gcc_tooldir)/sys-include\" \
|
||||
-DTOOL_INCLUDE_DIR=\"$(gcc_tooldir)/include\" \
|
||||
-DLOCAL_INCLUDE_DIR=\"$(includedir)\" \
|
||||
-DSTD_PROTO_DIR=\"$(libsubdir)\" \
|
||||
$(srcdir)/unprotoize.c
|
||||
|
||||
getopt.o: $(srcdir)/../libiberty/getopt.c $(srcdir)/../include/getopt.h
|
||||
rm -f getopt.c
|
||||
$(LN_S) $(srcdir)/../libiberty/getopt.c getopt.c
|
||||
|
|
@ -1952,56 +1891,19 @@ SYSCALLS.c.X: $(srcdir)/sys-types.h $(srcdir)/sys-protos.h $(GCC_PASSES) \
|
|||
-aux-info $@ -S -o tmp-SYSCALLS.s SYSCALLS.c
|
||||
-rm -f SYSCALLS.c tmp-SYSCALLS.s
|
||||
|
||||
|
||||
test-protoize-simple: ./protoize ./unprotoize $(GCC_PASSES)
|
||||
-rm -f tmp-proto.[cso]
|
||||
cp $(srcdir)/protoize.c tmp-proto.c
|
||||
chmod u+w tmp-proto.c
|
||||
./protoize -N -B ./ -x getopt.h -c "-B./ -Wall -Wwrite-strings \
|
||||
$(CFLAGS) $(INCLUDES) \
|
||||
-DGCC_INCLUDE_DIR=0 \
|
||||
-DGPLUSPLUS_INCLUDE_DIR=0 \
|
||||
-DCROSS_INCLUDE_DIR=0 \
|
||||
-DTOOL_INCLUDE_DIR=0 \
|
||||
-DSTD_PROTO_DIR=0" tmp-proto.c
|
||||
@echo '**********' Expect 400 lines of differences.
|
||||
-diff $(srcdir)/protoize.c tmp-proto.c > tmp-proto.diff
|
||||
-wc -l tmp-proto.diff
|
||||
./unprotoize -N -x getopt.h -c "-B./ -Wall -Wwrite-strings \
|
||||
$(CFLAGS) $(INCLUDES) \
|
||||
-DGCC_INCLUDE_DIR=0 \
|
||||
-DGPLUSPLUS_INCLUDE_DIR=0 \
|
||||
-DCROSS_INCLUDE_DIR=0 \
|
||||
-DTOOL_INCLUDE_DIR=0 \
|
||||
-DSTD_PROTO_DIR=0" tmp-proto.c
|
||||
@echo Expect zero differences.
|
||||
diff $(srcdir)/protoize.c tmp-proto.c | cat
|
||||
-rm -f tmp-proto.[cs] tmp-proto$(objext)
|
||||
|
||||
gcov.o: gcov.c gcov-io.h system.h
|
||||
|
||||
# Only one of 'gcov' or 'gcov.exe' is actually built, depending
|
||||
# upon whether $(exeext) is empty or not.
|
||||
gcov$(exeext): gcov.o $(LIBDEPS)
|
||||
$(CC) $(ALL_CFLAGS) $(LDFLAGS) gcov.o $(LIBS) -o $@
|
||||
#
|
||||
# Build the include directory. The stamp files are stmp-* rather than
|
||||
# s-* so that mostlyclean does not force the include directory to
|
||||
# be rebuilt.
|
||||
|
||||
# Build the include directory including float.h (which no longer depends upon
|
||||
# enquire).
|
||||
stmp-int-hdrs: stmp-fixinc $(USER_H) xlimits.h
|
||||
stmp-int-hdrs: $(USER_H) xlimits.h
|
||||
# Copy in the headers provided with gcc.
|
||||
# The sed command gets just the last file name component;
|
||||
# this is necessary because VPATH could add a dirname.
|
||||
# Using basename would be simpler, but some systems don't have it.
|
||||
# The touch command is here to workaround an AIX/Linux NFS bug.
|
||||
rm -rf include
|
||||
mkdir include
|
||||
for file in .. $(USER_H); do \
|
||||
if [ X$$file != X.. ]; then \
|
||||
realfile=`echo $$file | sed -e 's|.*/\([^/]*\)$$|\1|'`; \
|
||||
touch include/$$realfile; \
|
||||
rm -f include/$$realfile; \
|
||||
realfile=`basename $$file`; \
|
||||
cp $$file include; \
|
||||
chmod a+r include/$$realfile; \
|
||||
fi; \
|
||||
|
|
@ -2013,149 +1915,12 @@ stmp-int-hdrs: stmp-fixinc $(USER_H) xlimits.h
|
|||
if [ x$(FLOAT_H) != xMakefile.in ]; then \
|
||||
cp $(srcdir)/config/$(FLOAT_H) include/float.h && \
|
||||
chmod a+r include/float.h; \
|
||||
else :; fi
|
||||
# Install the README
|
||||
rm -f include/README
|
||||
cp $(srcdir)/README-fixinc include/README
|
||||
chmod a+r include/README
|
||||
touch $@
|
||||
fi
|
||||
|
||||
# Now that float.h no longer depends upon enquire, this is actually a no-op.
|
||||
stmp-headers:
|
||||
touch $@
|
||||
|
||||
fixinc.sh :
|
||||
DEST=`cd $(srcdir) ; pwd`/$@ CC=$(CC) MAKE=$(MAKE) CFLAGS="$(CFLAGS)" \
|
||||
export DEST CC MAKE CFLAGS ; \
|
||||
echo DEST=$$DEST CC=$$CC MAKE=$$MAKE CFLAGS=$$CFLAGS ; \
|
||||
cd ../contrib/fixinc ; \
|
||||
$(SHELL) mkfixinc.sh $(target) $$DEST
|
||||
|
||||
# Build fixed copies of system files.
|
||||
stmp-fixinc: $(FIXINCLUDES) gsyslimits.h
|
||||
rm -rf include
|
||||
mkdir include
|
||||
if [ x$(FIXINCLUDES) != xMakefile.in ]; \
|
||||
then \
|
||||
for dir in $(SYSTEM_HEADER_DIR) $(OTHER_FIXINCLUDES_DIRS); do \
|
||||
if [ -d $$dir ]; \
|
||||
then \
|
||||
$(SHELL) $(srcdir)/$(FIXINCLUDES) include $$dir; \
|
||||
else true; fi; \
|
||||
done; \
|
||||
if [ x$(INSTALL_ASSERT_H) != x ] ; \
|
||||
then \
|
||||
rm -f include/assert.h; \
|
||||
cp $(srcdir)/assert.h include/assert.h; \
|
||||
chmod a+r include/assert.h; \
|
||||
fi \
|
||||
else true; \
|
||||
fi
|
||||
rm -f include/syslimits.h
|
||||
if [ -f include/limits.h ]; then \
|
||||
mv include/limits.h include/syslimits.h; \
|
||||
else \
|
||||
cp $(srcdir)/gsyslimits.h include/syslimits.h; \
|
||||
fi
|
||||
chmod a+r include/syslimits.h
|
||||
# If $(SYSTEM_HEADER_DIR) is $(gcc_tooldir)/sys-include, and
|
||||
# that directory exists, then make sure that $(libsubdir) exists.
|
||||
# This is because cpp is compiled to find $(gcc_tooldir)/include via
|
||||
# $(libsubdir)/$(unlibsubdir), which will only work if $(libsubdir)
|
||||
# exists.
|
||||
if [ "$(SYSTEM_HEADER_DIR)" = "$(gcc_tooldir)/sys-include" ] \
|
||||
&& [ -d $(gcc_tooldir)/sys-include ]; then \
|
||||
if [ -d $(libdir) ] ; then true ; else mkdir $(libdir) ; fi; \
|
||||
if [ -d $(libdir)/gcc-lib ] ; then true ; else mkdir $(libdir)/gcc-lib; fi; \
|
||||
if [ -d $(libdir)/gcc-lib/$(target_alias) ] ; then true ; else mkdir $(libdir)/gcc-lib/$(target_alias) ; fi; \
|
||||
if [ -d $(libdir)/gcc-lib/$(target_alias)/$(version) ] ; then true ; else mkdir $(libdir)/gcc-lib/$(target_alias)/$(version) ; fi; \
|
||||
else true; fi
|
||||
|
||||
touch stmp-fixinc
|
||||
|
||||
# Files related to the fixproto script.
|
||||
|
||||
deduced.h: $(GCC_PASSES) $(srcdir)/scan-types.sh stmp-int-hdrs
|
||||
if [ -d $(SYSTEM_HEADER_DIR) ]; \
|
||||
then \
|
||||
CC="$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(ALL_CPPFLAGS) -I. -I$(srcdir) -Iinclude -I${SYSTEM_HEADER_DIR}"; \
|
||||
export CC; \
|
||||
$(SHELL) $(srcdir)/scan-types.sh "$(srcdir)" >tmp-deduced.h; \
|
||||
mv tmp-deduced.h deduced.h; \
|
||||
else \
|
||||
touch deduced.h; \
|
||||
fi
|
||||
|
||||
gen-protos: gen-protos.o scan.o cppalloc.o $(HOST_LIBDEPS)
|
||||
${HOST_CC} $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
|
||||
gen-protos.o scan.o cppalloc.o $(HOST_LIBS)
|
||||
|
||||
gen-protos.o: gen-protos.c scan.h $(build_xm_file) system.h
|
||||
$(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/gen-protos.c
|
||||
|
||||
scan.o: scan.c scan.h $(build_xm_file) system.h
|
||||
$(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/scan.c
|
||||
|
||||
xsys-protos.h: $(GCC_PASSES) $(srcdir)/sys-protos.h deduced.h gen-protos Makefile
|
||||
cat deduced.h $(srcdir)/sys-protos.h > tmp-fixtmp.c
|
||||
mv tmp-fixtmp.c fixtmp.c
|
||||
$(GCC_FOR_TARGET) fixtmp.c -w -U__SIZE_TYPE__ -U__PTRDIFF_TYPE__ -U__WCHAR_TYPE__ -E \
|
||||
| sed -e 's/ / /g' -e 's/ *(/ (/g' -e 's/ [ ]*/ /g' -e 's/( )/()/' \
|
||||
| ./gen-protos >xsys-protos.hT
|
||||
mv xsys-protos.hT xsys-protos.h
|
||||
rm -rf fixtmp.c
|
||||
|
||||
fix-header: fix-header.o scan-decls.o scan.o xsys-protos.h $(HOST_LIBDEPS) \
|
||||
libcpp.a
|
||||
$(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ fix-header.o \
|
||||
scan-decls.o scan.o libcpp.a $(HOST_LIBS)
|
||||
|
||||
fix-header.o: fix-header.c $(srcdir)/../include/obstack.h scan.h \
|
||||
xsys-protos.h $(build_xm_file) system.h cpplib.h machmode.h cpphash.h
|
||||
$(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/fix-header.c
|
||||
|
||||
# CYGNUS LOCAL: binary installation
|
||||
fixproto-defines:
|
||||
rm -f fixproto-defines; \
|
||||
echo "#!/bin/sh" > fixproto-defines ; \
|
||||
echo "# Print FIXPROTO_DEFINES needed by fixproto." >> fixproto-defines ; \
|
||||
echo "echo '$(FIXPROTO_DEFINES)'" >> fixproto-defines ; \
|
||||
chmod +x fixproto-defines
|
||||
# END CYGNUS LOCAL
|
||||
|
||||
scan-decls.o: scan-decls.c scan.h cpplib.h machmode.h $(build_xm_file) system.h
|
||||
$(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/scan-decls.c
|
||||
|
||||
|
||||
# stmp-fixproto depends on this, not on fix-header directly.
|
||||
# The idea is to make sure fix-header gets built,
|
||||
# but not rerun fixproto after each stage
|
||||
# just because fix-header's mtime has changed.
|
||||
# CYGNUS LOCAL: binary installation
|
||||
fixhdr.ready: fix-header fixproto-defines
|
||||
-if [ -f fixhdr.ready ] ; then \
|
||||
true; \
|
||||
else \
|
||||
touch fixhdr.ready; \
|
||||
fi
|
||||
|
||||
# stmp-headers is to make sure fixincludes has already finished.
|
||||
# The if statement is so that we don't run fixproto a second time
|
||||
# if it has already been run on the files in `include'.
|
||||
stmp-fixproto: fixhdr.ready fixproto stmp-headers
|
||||
@echo "Various warnings and error messages from fixproto are normal"
|
||||
-if [ -d include ] ; then true; else mkdir include; fi
|
||||
-if [ -f include/fixed ] ; then true; \
|
||||
else \
|
||||
: This line works around a 'make' bug in BSDI 1.1.; \
|
||||
FIXPROTO_DEFINES="$(FIXPROTO_DEFINES)"; export FIXPROTO_DEFINES; \
|
||||
if [ -d $(SYSTEM_HEADER_DIR) ] ; then \
|
||||
$(SHELL) ${srcdir}/fixproto include include $(SYSTEM_HEADER_DIR); \
|
||||
else true; fi; \
|
||||
touch include/fixed; \
|
||||
fi
|
||||
touch stmp-fixproto
|
||||
#
|
||||
# Remake the info files.
|
||||
# CYGNUS LOCAL: built in build directory
|
||||
|
||||
|
|
@ -2166,12 +1931,12 @@ cpp.info: $(srcdir)/cpp.texi
|
|||
$(MAKEINFO) $(MAKEINFOFLAGS) -I$(srcdir) -o cpp.info $(srcdir)/cpp.texi
|
||||
|
||||
gcc.info: $(srcdir)/gcc.texi extend.texi install.texi invoke.texi \
|
||||
md.texi rtl.texi tm.texi gcov.texi
|
||||
md.texi rtl.texi tm.texi
|
||||
$(MAKEINFO) $(MAKEINFOFLAGS) -I$(srcdir) -o gcc.info $(srcdir)/gcc.texi
|
||||
|
||||
dvi: gcc.dvi cpp.dvi lang.dvi
|
||||
|
||||
gcc.dvi: $(srcdir)/gcc.texi $(srcdir)/extend.texi $(srcdir)/invoke.texi $(srcdir)/md.texi $(srcdir)/rtl.texi $(srcdir)/tm.texi $(srcdir)/gcov.texi
|
||||
gcc.dvi: $(srcdir)/gcc.texi $(srcdir)/extend.texi $(srcdir)/invoke.texi $(srcdir)/md.texi $(srcdir)/rtl.texi $(srcdir)/tm.texi
|
||||
TEXINPUTS=${texidir}:$(srcdir):$$TEXINPUTS tex gcc.texi
|
||||
texindex gcc.??
|
||||
TEXINPUTS=${texidir}:$(srcdir):$$TEXINPUTS tex gcc.texi
|
||||
|
|
@ -2182,7 +1947,7 @@ cpp.dvi: $(srcdir)/cpp.texi
|
|||
TEXINPUTS=${texidir}:$(srcdir):$$TEXINPUTS tex cpp.texi
|
||||
|
||||
# CYGNUS LOCAL doc
|
||||
usegcc.dvi: usegcc.texi $(srcdir)/extend.texi $(srcdir)/invoke.texi $(srcdir)/md.texi $(srcdir)/gcov.texi
|
||||
usegcc.dvi: usegcc.texi $(srcdir)/extend.texi $(srcdir)/invoke.texi $(srcdir)/md.texi
|
||||
TEXINPUTS=${texidir}:$(srcdir):$$TEXINPUTS tex usegcc.texi
|
||||
texindex usegcc.??
|
||||
TEXINPUTS=${texidir}:$(srcdir):$$TEXINPUTS tex usegcc.texi
|
||||
|
|
@ -2195,7 +1960,7 @@ usegcc.texi: $(srcdir)/gcc.texi
|
|||
$(srcdir)/gcc.texi > usegcc.texi
|
||||
|
||||
|
||||
usegcc.info: usegcc.texi $(srcdir)/extend.texi $(srcdir)/invoke.texi $(srcdir)/gcov.texi
|
||||
usegcc.info: usegcc.texi $(srcdir)/extend.texi $(srcdir)/invoke.texi
|
||||
$(MAKEINFO) -I$(srcdir) -o usegcc.info usegcc.texi
|
||||
|
||||
# CYGNUS LOCAL: don't rebuild gcc/INSTALL, ever.
|
||||
|
|
@ -2241,10 +2006,7 @@ mostlyclean: lang.mostlyclean
|
|||
# Delete some files made during installation.
|
||||
-rm -f specs float.h-* enquire SYSCALLS.c.X SYSCALLS.c
|
||||
-rm -f collect mips-tfile mips-tdump alloca.s
|
||||
# Delete files generated for fixproto
|
||||
# CYGNUS LOCAL: binary installation
|
||||
-rm -rf fix-header xsys-protos.h deduced.h tmp-deduced.h \
|
||||
fixproto-defines gen-protos fixproto.list fixtmp.* fixhdr.ready
|
||||
# Delete unwanted output files from TeX.
|
||||
-rm -f *.toc *.log *.vr *.fn *.cp *.tp *.ky *.pg
|
||||
-rm -f */*.toc */*.log */*.vr */*.fn */*.cp */*.tp */*.ky */*.pg
|
||||
|
|
@ -2426,51 +2188,6 @@ install-common: native installdirs lang.install-common
|
|||
$(INSTALL_DATA) specs $(libsubdir)/specs; \
|
||||
chmod a-x $(libsubdir)/specs; \
|
||||
fi
|
||||
# Install protoize if it was compiled.
|
||||
-if [ -f protoize$(exeext) ]; \
|
||||
then \
|
||||
if [ -f gcc-cross$(exeext) ] ; then \
|
||||
rm -f $(bindir)/$(PROTOIZE_CROSS_NAME)$(exeext); \
|
||||
$(INSTALL_PROGRAM) protoize$(exeext) $(bindir)/$(PROTOIZE_CROSS_NAME)$(exeext); \
|
||||
rm -f $(bindir)/$(UNPROTOIZE_CROSS_NAME)$(exeext); \
|
||||
$(INSTALL_PROGRAM) unprotoize$(exeext) $(bindir)/$(UNPROTOIZE_CROSS_NAME)$(exeext); \
|
||||
else \
|
||||
rm -f $(bindir)/$(PROTOIZE_INSTALL_NAME)$(exeext); \
|
||||
$(INSTALL_PROGRAM) protoize$(exeext) $(bindir)/$(PROTOIZE_INSTALL_NAME)$(exeext); \
|
||||
rm -f $(bindir)/$(UNPROTOIZE_INSTALL_NAME)$(exeext); \
|
||||
$(INSTALL_PROGRAM) unprotoize$(exeext) $(bindir)/$(UNPROTOIZE_INSTALL_NAME)$(exeext); \
|
||||
fi ; \
|
||||
rm -f $(libsubdir)/SYSCALLS.c.X; \
|
||||
$(INSTALL_DATA) SYSCALLS.c.X $(libsubdir)/SYSCALLS.c.X; \
|
||||
chmod a-x $(libsubdir)/SYSCALLS.c.X; \
|
||||
fi
|
||||
-rm -f $(libsubdir)/cpp$(exeext)
|
||||
$(INSTALL_PROGRAM) cpp$(exeext) $(libsubdir)/cpp$(exeext)
|
||||
# Install gcov if it was compiled.
|
||||
-if [ -f gcov$(exeext) ]; \
|
||||
then \
|
||||
rm -f $(bindir)/gcov$(exeext); \
|
||||
$(INSTALL_PROGRAM) gcov$(exeext) $(bindir)/gcov$(exeext); \
|
||||
chmod a+x $(bindir)/gcov$(exeext); \
|
||||
fi
|
||||
# CYGNUS LOCAL: binary installation
|
||||
# This is for the sake of binary installation.
|
||||
# If newlib exists, then we don't want to run fixincludes or fix-header.
|
||||
# Otherwise, install them if they exist and should be run.
|
||||
if [ -d $(objdir)/../$(target_alias)/newlib ] ; then \
|
||||
true ; \
|
||||
else \
|
||||
if [ -d $(gcc_tooldir)/install-tools ] ; then true ; else mkdir $(gcc_tooldir)/install-tools ; fi ; \
|
||||
if [ x$(FIXINCLUDES) != xMakefile.in ] ; then \
|
||||
$(INSTALL_PROGRAM) $(srcdir)/$(FIXINCLUDES) $(gcc_tooldir)/install-tools/fixincludes ; \
|
||||
else true; fi; \
|
||||
if [ -f fix-header ] ; then \
|
||||
$(INSTALL_PROGRAM) fix-header $(gcc_tooldir)/install-tools/fix-header ; \
|
||||
$(INSTALL_PROGRAM) $(srcdir)/fixproto $(gcc_tooldir)/install-tools/fixproto ; \
|
||||
$(INSTALL_PROGRAM) fixproto-defines $(gcc_tooldir)/install-tools/fixproto-defines ; \
|
||||
else true; fi; \
|
||||
fi
|
||||
# END CYGNUS LOCAL
|
||||
|
||||
# Install the driver program as $(target_alias)-gcc
|
||||
# and also as either gcc (if native) or $(gcc_tooldir)/bin/gcc.
|
||||
|
|
@ -2490,17 +2207,6 @@ install-driver: xgcc$(exeext)
|
|||
mv $(bindir)/$(target_alias)-gcc-1$(exeext) $(bindir)/$(target_alias)-gcc$(exeext); \
|
||||
fi
|
||||
|
||||
# CYGNUS LOCAL: compile-man-sysv
|
||||
# Some system V machines don't come with nroff so we'll work out the
|
||||
# pages here for them.
|
||||
compile-man-sysv:
|
||||
for i in gcc cccp protoize unprotoize ; do \
|
||||
nroff -man $$i.1 | col -b > $$i.t ; \
|
||||
pack $$i.t ; rm -f $$i.t; \
|
||||
mv $$i.t.z $$i.z ;\
|
||||
done
|
||||
# END CYGNUS LOCAL
|
||||
|
||||
# Install the info files.
|
||||
# $(INSTALL_DATA) might be a relative pathname, so we can't cd into srcdir
|
||||
# to do the install. The sed rule was copied from stmp-int-hdrs.
|
||||
|
|
@ -2629,14 +2335,9 @@ uninstall: lang.uninstall
|
|||
-rm -rf $(libsubdir)
|
||||
-rm -rf $(bindir)/$(GCC_INSTALL_NAME)$(exeext)
|
||||
-rm -rf $(bindir)/$(GCC_CROSS_NAME)$(exeext)
|
||||
-rm -rf $(bindir)/protoize$(exeext)
|
||||
-rm -rf $(bindir)/unprotoize$(exeext)
|
||||
-rm -rf $(bindir)/gcov$(exeext)
|
||||
-rm -rf $(man1dir)/$(GCC_INSTALL_NAME)$(manext)
|
||||
-rm -rf $(man1dir)/$(GCC_CROSS_NAME)$(manext)
|
||||
-rm -rf $(man1dir)/cccp$(manext)
|
||||
-rm -rf $(man1dir)/protoize$(manext)
|
||||
-rm -rf $(man1dir)/unprotoize$(manext)
|
||||
# CYGNUS LOCAL: We install cpp.1.
|
||||
-rm -rf $(man1dir)/cpp$(manext)
|
||||
-rm -f $(infodir)/cpp.info* $(infodir)/gcc.info*
|
||||
|
|
|
|||
1437
gcc/fix-header.c
1437
gcc/fix-header.c
File diff suppressed because it is too large
Load Diff
|
|
@ -1,5 +0,0 @@
|
|||
s/!__STDC__/!defined (__STRICT_ANSI__)/g
|
||||
s/getcwd(char \*, int)/getcwd(char *, size_t)/
|
||||
s/Format\[\]/Format\[1\]/
|
||||
s/^#if !defined (__cplusplus)/#if 0/
|
||||
s/^#define DECLSPEC_IMPORT __declspec(dllimport)/#define DECLSPEC_IMPORT/
|
||||
185
gcc/fixinc.dgux
185
gcc/fixinc.dgux
|
|
@ -1,185 +0,0 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# modified for dgux by hassey@dg-rtp.dg.com based on
|
||||
#
|
||||
# fixinc.svr4 written by Ron Guilmette (rfg@ncd.com).
|
||||
#
|
||||
# This file is part of GNU CC.
|
||||
#
|
||||
# GNU CC is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2, or (at your option)
|
||||
# any later version.
|
||||
#
|
||||
# GNU CC is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with GNU CC; see the file COPYING. If not, write to
|
||||
# the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
# Boston, MA 02111-1307, USA.
|
||||
#
|
||||
#
|
||||
# See README-fixinc for more information.
|
||||
|
||||
# Directory containing the original header files.
|
||||
INPUT=${2-${INPUT-/usr/include}}
|
||||
|
||||
# Fail if no arg to specify a directory for the output.
|
||||
if [ x$1 = x ]
|
||||
then echo fixincludes: no output directory specified
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Directory in which to store the results.
|
||||
LIB=${1?"fixincludes: output directory not specified"}
|
||||
|
||||
# Make sure it exists.
|
||||
if [ ! -d $LIB ]; then
|
||||
mkdir $LIB || exit 1
|
||||
fi
|
||||
|
||||
ORIG_DIR=`pwd`
|
||||
|
||||
# Make LIB absolute if it is relative.
|
||||
# Don't do this if not necessary, since may screw up automounters.
|
||||
case $LIB in
|
||||
/*)
|
||||
;;
|
||||
*)
|
||||
cd $LIB; LIB=`${PWDCMD-pwd}`
|
||||
;;
|
||||
esac
|
||||
|
||||
echo 'Building fixincludes in ' ${LIB}
|
||||
|
||||
# Determine whether this filesystem has symbolic links.
|
||||
if ln -s X $LIB/ShouldNotExist 2>/dev/null; then
|
||||
rm -f $LIB/ShouldNotExist
|
||||
LINKS=true
|
||||
else
|
||||
LINKS=false
|
||||
fi
|
||||
|
||||
echo 'Making directories:'
|
||||
cd ${INPUT}
|
||||
if $LINKS; then
|
||||
files=`ls -LR | sed -n s/:$//p`
|
||||
else
|
||||
files=`find . -type d -print | sed '/^.$/d'`
|
||||
fi
|
||||
for file in $files; do
|
||||
rm -rf $LIB/$file
|
||||
if [ ! -d $LIB/$file ]
|
||||
then mkdir $LIB/$file
|
||||
fi
|
||||
done
|
||||
|
||||
# treetops gets an alternating list
|
||||
# of old directories to copy
|
||||
# and the new directories to copy to.
|
||||
treetops="${INPUT} ${LIB}"
|
||||
|
||||
if $LINKS; then
|
||||
echo 'Making internal symbolic directory links'
|
||||
for file in $files; do
|
||||
dest=`ls -ld $file | sed -n 's/.*-> //p'`
|
||||
if [ "$dest" ]; then
|
||||
cwd=`pwd`
|
||||
# In case $dest is relative, get to $file's dir first.
|
||||
cd ${INPUT}
|
||||
cd `echo ./$file | sed -n 's&[^/]*$&&p'`
|
||||
# Check that the target directory exists.
|
||||
# Redirections changed to avoid bug in sh on Ultrix.
|
||||
(cd $dest) > /dev/null 2>&1
|
||||
if [ $? = 0 ]; then
|
||||
cd $dest
|
||||
# X gets the dir that the link actually leads to.
|
||||
x=`pwd`
|
||||
# If link leads back into ${INPUT},
|
||||
# make a similar link here.
|
||||
if expr $x : "${INPUT}/.*" > /dev/null; then
|
||||
# Y gets the actual target dir name, relative to ${INPUT}.
|
||||
y=`echo $x | sed -n "s&${INPUT}/&&p"`
|
||||
# DOTS is the relative path from ${LIB}/$file's dir back to ${LIB}.
|
||||
dots=`echo "$file" |
|
||||
sed -e 's@^./@@' -e 's@/./@/@g' -e 's@[^/][^/]*@..@g' -e 's@..$@@'`
|
||||
echo $file '->' $dots$y ': Making link'
|
||||
rm -fr ${LIB}/$file > /dev/null 2>&1
|
||||
ln -s $dots$y ${LIB}/$file > /dev/null 2>&1
|
||||
else
|
||||
# If the link is to outside ${INPUT},
|
||||
# treat this directory as if it actually contained the files.
|
||||
# This line used to have $dest instead of $x.
|
||||
# $dest seemed to be wrong for links found in subdirectories
|
||||
# of ${INPUT}. Does this change break anything?
|
||||
treetops="$treetops $x ${LIB}/$file"
|
||||
fi
|
||||
fi
|
||||
cd $cwd
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Completely replace <_int_varargs.h> with a file that defines
|
||||
# va_list and gnuc_va_list
|
||||
|
||||
file=_int_varargs.h
|
||||
if [ -r ${INPUT}/$file ]; then
|
||||
echo Replacing $file
|
||||
cat > ${LIB}/$file << EOF
|
||||
/* This file was generated by fixinc.dgux. */
|
||||
#ifndef __INT_VARARGS_H
|
||||
#define __INT_VARARGS_H
|
||||
|
||||
#if defined(__m88k__) && defined (__DGUX__)
|
||||
#ifndef __GNUC_VA_LIST
|
||||
#define __GNUC_VA_LIST
|
||||
typedef struct
|
||||
{
|
||||
int __va_arg; /* argument number */
|
||||
int *__va_stk; /* start of args passed on stack */
|
||||
int *__va_reg; /* start of args passed in regs */
|
||||
} __gnuc_va_list;
|
||||
#endif /* not __GNUC_VA_LIST */
|
||||
#endif /* 88k && dgux */
|
||||
|
||||
#ifndef _VA_LIST_
|
||||
#define _VA_LIST_
|
||||
typedef __gnuc_va_list va_list;
|
||||
#endif /* _VA_LIST_ */
|
||||
|
||||
#endif /* __INT_VARARGS_H */
|
||||
|
||||
EOF
|
||||
chmod a+r ${LIB}/$file
|
||||
fi
|
||||
|
||||
echo 'Removing unneeded directories:'
|
||||
cd $LIB
|
||||
files=`find . -type d -print | sort -r`
|
||||
for file in $files; do
|
||||
rmdir $LIB/$file > /dev/null 2>&1
|
||||
done
|
||||
|
||||
if $LINKS; then
|
||||
echo 'Making internal symbolic non-directory links'
|
||||
cd ${INPUT}
|
||||
files=`find . -type l -print`
|
||||
for file in $files; do
|
||||
dest=`ls -ld $file | sed -n 's/.*-> //p'`
|
||||
if expr "$dest" : '[^/].*' > /dev/null; then
|
||||
target=${LIB}/`echo file | sed "s|[^/]*\$|$dest|"`
|
||||
if [ -f $target ]; then
|
||||
ln -s $dest ${LIB}/$file >/dev/null 2>&1
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
cd ${ORIG_DIR}
|
||||
|
||||
exit 0
|
||||
|
||||
225
gcc/fixinc.irix
225
gcc/fixinc.irix
|
|
@ -1,225 +0,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, 1998 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
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
#! /bin/sh
|
||||
# Fix struct exception in /usr/include/math.h.
|
||||
#
|
||||
# We expect several systems which did not need fixincludes in the past
|
||||
# to need to fix just math.h. So we created a separate fixinc.math
|
||||
# script to fix just that problem.
|
||||
# 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
|
||||
exit 0
|
||||
257
gcc/fixinc.ptx
257
gcc/fixinc.ptx
|
|
@ -1,257 +0,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
|
||||
|
||||
427
gcc/fixinc.sco
427
gcc/fixinc.sco
|
|
@ -1,427 +0,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, 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.
|
||||
#
|
||||
# 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 <$file>
|
||||
#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 system include file.
|
||||
chmod a+r $LIB/$file
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
echo 'Removing unneeded directories:'
|
||||
cd $LIB
|
||||
files=`find . -type d -print | sort -r`
|
||||
for file in $files; do
|
||||
rmdir $LIB/$file > /dev/null 2>&1
|
||||
done
|
||||
|
||||
if $LINKS; then
|
||||
echo 'Making internal symbolic non-directory links'
|
||||
cd ${INPUT}
|
||||
files=`find . -type l -print`
|
||||
for file in $files; do
|
||||
dest=`ls -ld $file | sed -n 's/.*-> //p'`
|
||||
if expr "$dest" : '[^/].*' > /dev/null; then
|
||||
target=${LIB}/`echo file | sed "s|[^/]*\$|$dest|"`
|
||||
if [ -f $target ]; then
|
||||
ln -s $dest ${LIB}/$file >/dev/null 2>&1
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
exit 0
|
||||
1726
gcc/fixinc.svr4
1726
gcc/fixinc.svr4
File diff suppressed because it is too large
Load Diff
232
gcc/fixinc.winnt
232
gcc/fixinc.winnt
|
|
@ -1,232 +0,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
|
||||
|
|
@ -1,86 +0,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
|
||||
|
|
@ -1,136 +0,0 @@
|
|||
#! /bin/sh
|
||||
#
|
||||
# The script is created for Cygnus by vmakarov@cygnus.com and based on
|
||||
# fixinc.wrap
|
||||
#
|
||||
# This script is designed for x86 with gnulibc of version 2.0 and less
|
||||
# for solution of problems with invalid asm-statements by creating
|
||||
# small wrappers around the include files containg the asm-statements.
|
||||
#
|
||||
# See README-fixinc for more information.
|
||||
|
||||
|
||||
# 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
|
||||
|
||||
# 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 fixed headers in ${LIB}
|
||||
|
||||
file=selectbits.h
|
||||
echo Fixed $file for glibc-2.0.x
|
||||
rm -f $LIB/$file
|
||||
cat <<'__EOF__' >$LIB/$file
|
||||
/* This file fixes __FD_ZERO bug for glibc-2.0.x. */
|
||||
#ifndef _SELECTBITS_H_WRAPPER
|
||||
#include <features.h>
|
||||
#include_next <selectbits.h>
|
||||
|
||||
#if defined(__FD_ZERO) && defined(__GLIBC__) && defined(__GLIBC_MINOR__) && __GLIBC__ == 2 && __GLIBC_MINOR__ == 0
|
||||
#undef __FD_ZERO
|
||||
#define __FD_ZERO(fdsetp) \
|
||||
do { \
|
||||
int __d0, __d1; \
|
||||
__asm__ __volatile__ ("cld; rep; stosl" \
|
||||
: "=&c" (__d0), "=&D" (__d1) \
|
||||
: "a" (0), "0" (sizeof (__fd_set) \
|
||||
/ sizeof (__fd_mask)), \
|
||||
"1" ((__fd_mask *) (fdsetp)) \
|
||||
: "memory"); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#define _SELECTBITS_H_WRAPPER
|
||||
#endif /* _SELECTBITS_H_WRAPPER */
|
||||
__EOF__
|
||||
# Define _SELECTBITS_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 <selectbits.h>.
|
||||
chmod a+r $LIB/$file
|
||||
|
||||
# asm/posix_types.h for libc version 1.x
|
||||
file=asm/posix_types.h
|
||||
echo Fixed $file for glibc-1.x
|
||||
rm -f $LIB/$file
|
||||
dir=`dirname $LIB/$file`
|
||||
if [ ! -d $dir ]; then
|
||||
mkdir -p $dir || exit 1
|
||||
fi
|
||||
cat <<'__EOF__' >$LIB/$file
|
||||
/* This file fixes __FD_ZERO bug for glibc-1.x. */
|
||||
#ifndef _POSIX_TYPES_H_WRAPPER
|
||||
#include <features.h>
|
||||
#include_next <asm/posix_types.h>
|
||||
|
||||
#if defined(__FD_ZERO) && !defined(__GLIBC__)
|
||||
#undef __FD_ZERO
|
||||
#define __FD_ZERO(fdsetp) \
|
||||
do { \
|
||||
int __d0, __d1; \
|
||||
__asm__ __volatile__("cld ; rep ; stosl" \
|
||||
: "=&c" (__d0), "=&D" (__d1) \
|
||||
: "a" (0), "0" (__FDSET_LONGS), \
|
||||
"1" ((__kernel_fd_set *) (fdsetp)) :"memory"); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#define _POSIX_TYPES_H_WRAPPER
|
||||
#endif /* _POSIX_TYPES_H_WRAPPER */
|
||||
__EOF__
|
||||
# Define _POSIX_TYPES_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 <asm/posix_types.h>.
|
||||
chmod a+r $LIB/$file
|
||||
|
||||
# gnu/types.h for libc version 1.x
|
||||
file=gnu/types.h
|
||||
echo Fixed $file for glibc-1.x
|
||||
rm -f $LIB/$file
|
||||
dir=`dirname $LIB/$file`
|
||||
if [ ! -d $dir ]; then
|
||||
mkdir -p $dir || exit 1
|
||||
fi
|
||||
cat <<'__EOF__' >$LIB/$file
|
||||
/* This file fixes __FD_ZERO bug for glibc-1.x. */
|
||||
#ifndef _TYPES_H_WRAPPER
|
||||
#include <features.h>
|
||||
#include_next <gnu/types.h>
|
||||
|
||||
#if defined(__FD_ZERO) && !defined(__GLIBC__)
|
||||
#undef __FD_ZERO
|
||||
# define __FD_ZERO(fdsetp) \
|
||||
do { \
|
||||
int __d0, __d1; \
|
||||
__asm__ __volatile__("cld ; rep ; stosl" \
|
||||
: "=&c" (__d0), "=&D" (__d1) \
|
||||
: "a" (0), "0" (__FDSET_LONGS), \
|
||||
"1" ((__fd_set *) (fdsetp)) :"memory"); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#define _TYPES_H_WRAPPER
|
||||
#endif /* _TYPES_H_WRAPPER */
|
||||
__EOF__
|
||||
# Define _TYPES_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 <gnu/types.h>.
|
||||
chmod a+r $LIB/$file
|
||||
|
||||
exit 0
|
||||
|
||||
|
|
@ -1,132 +0,0 @@
|
|||
# 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 1999/01/13 22:56:21 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
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
|
||||
The fast-fixincludes system now, to the best of our collective belief,
|
||||
correctly implements exactly the same functionality as the previous
|
||||
fixincludes/fixinc.* shell scripts. On most systems where many fixes
|
||||
are required, this is accomplished by putting most of the functionality
|
||||
into a binary executable. On systems that had dedicated fixinc.* shell
|
||||
scripts, those scripts are still used by default until they can be
|
||||
converted.
|
||||
|
||||
KNOWN PROBLEMS
|
||||
|
||||
There may be some systems on which the fixinc binary program appears
|
||||
to be functional, but fails to work. Current thinking is that this
|
||||
is due to some new process limitations (fork() calls) on those
|
||||
systems. If you are experiencing this problem, then copy the script
|
||||
${src}/gcc/fixinc/inclhack.sh into ${builddir}/gcc/fixinc.sh and run
|
||||
make again.
|
||||
|
||||
Oh, yes, please also report the problem with a description of
|
||||
the failure mode (symptoms) and the output from:
|
||||
|
||||
egcs/config.guess
|
||||
|
||||
TO DO
|
||||
|
||||
* fixincl needs to be converted to use gcc's system.h, libiberty, and
|
||||
other portability frameworks.
|
||||
|
||||
* FIXME: XXX needs to have tests for file descriptors > 10 or 12 added
|
||||
to detect/solve XXX.
|
||||
|
||||
*
|
||||
|
||||
|
||||
|
||||
THEORY OF OPS
|
||||
|
||||
inclhack.def contains a list of potential fixes to be applied to the
|
||||
system headers. This file is processed by autogen to make both a
|
||||
shell script and a binary to apply those fixes to your headers.
|
||||
If the binary cannot be built, the shell version will be used instead.
|
||||
|
||||
If mkfixinc.sh determines that your system needs machine-specific
|
||||
fixes that have not yet been applied to inclhack.def, it will install
|
||||
and use the current fixinc.* for that system instead.
|
||||
|
||||
|
||||
|
|
@ -1,200 +0,0 @@
|
|||
# !/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.
|
||||
|
||||
# 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=`${PWDCMD-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:'
|
||||
# Directory containing the original header files.
|
||||
shift
|
||||
if [ $# -eq 0 ] ; then
|
||||
set /usr/include
|
||||
fi
|
||||
|
||||
INLIST="$@"
|
||||
|
||||
for INPUT in ${INLIST} ; do
|
||||
cd ${ORIG_DIR}
|
||||
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
|
||||
|
||||
done
|
||||
|
||||
if [ x${INSTALL_ASSERT_H} != x ] ;
|
||||
then
|
||||
cd ${ORIG_DIR}
|
||||
rm -f include/assert.h;
|
||||
cp $(srcdir)/assert.h include/assert.h;
|
||||
chmod a+r include/assert.h;
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
|
@ -1,243 +0,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.
|
||||
|
||||
# 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=`${PWDCMD-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}
|
||||
# Directory containing the original header files.
|
||||
shift
|
||||
if [ $# -eq 0 ] ; then
|
||||
set /usr/include
|
||||
fi
|
||||
|
||||
INLIST="$@"
|
||||
|
||||
for INPUT in ${INLIST} ; do
|
||||
cd ${ORIG_DIR}
|
||||
cd ${INPUT}
|
||||
|
||||
#
|
||||
# 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
|
||||
|
||||
done
|
||||
|
||||
if [ x${INSTALL_ASSERT_H} != x ] ;
|
||||
then
|
||||
cd ${ORIG_DIR}
|
||||
rm -f include/assert.h;
|
||||
cp $(srcdir)/assert.h include/assert.h;
|
||||
chmod a+r include/assert.h;
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
|
@ -1,274 +0,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.
|
||||
|
||||
# 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=`${PWDCMD-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 '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}
|
||||
# Directory containing the original header files.
|
||||
shift
|
||||
if [ $# -eq 0 ] ; then
|
||||
set /usr/include
|
||||
fi
|
||||
|
||||
INLIST="$@"
|
||||
|
||||
for INPUT in ${INLIST} ; do
|
||||
cd ${ORIG_DIR}
|
||||
cd ${INPUT}
|
||||
|
||||
# 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
|
||||
|
||||
done
|
||||
|
||||
if [ x${INSTALL_ASSERT_H} != x ] ;
|
||||
then
|
||||
cd ${ORIG_DIR}
|
||||
rm -f include/assert.h;
|
||||
cp $(srcdir)/assert.h include/assert.h;
|
||||
chmod a+r include/assert.h;
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
|
@ -1,445 +0,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.
|
||||
|
||||
# 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=`${PWDCMD-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:'
|
||||
# Directory containing the original header files.
|
||||
shift
|
||||
if [ $# -eq 0 ] ; then
|
||||
set /usr/include
|
||||
fi
|
||||
|
||||
INLIST="$@"
|
||||
|
||||
for INPUT in ${INLIST} ; do
|
||||
cd ${ORIG_DIR}
|
||||
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 <$file>
|
||||
#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
|
||||
|
||||
done
|
||||
|
||||
if [ x${INSTALL_ASSERT_H} != x ] ;
|
||||
then
|
||||
cd ${ORIG_DIR}
|
||||
rm -f include/assert.h;
|
||||
cp $(srcdir)/assert.h include/assert.h;
|
||||
chmod a+r include/assert.h;
|
||||
fi
|
||||
|
||||
exit 0
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,240 +0,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
|
||||
|
||||
if [ x${INSTALL_ASSERT_H} != x ] ;
|
||||
then
|
||||
cd ${ORIG_DIR}
|
||||
rm -f include/assert.h;
|
||||
cp $(srcdir)/assert.h include/assert.h;
|
||||
chmod a+r include/assert.h;
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
|
@ -1,115 +0,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 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=`${PWDCMD-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 fixed headers in ${LIB}
|
||||
# Directory containing the original header files.
|
||||
shift
|
||||
if [ $# -eq 0 ] ; then
|
||||
set /usr/include
|
||||
fi
|
||||
|
||||
INLIST="$@"
|
||||
|
||||
for INPUT in ${INLIST} ; do
|
||||
cd ${ORIG_DIR}
|
||||
cd ${INPUT}
|
||||
|
||||
# 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
|
||||
|
||||
done
|
||||
|
||||
if [ x${INSTALL_ASSERT_H} != x ] ;
|
||||
then
|
||||
cd ${ORIG_DIR}
|
||||
rm -f include/assert.h;
|
||||
cp $(srcdir)/assert.h include/assert.h;
|
||||
chmod a+r include/assert.h;
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
|
@ -1,140 +0,0 @@
|
|||
#! /bin/sh
|
||||
#
|
||||
# The script is created for Cygnus by vmakarov@cygnus.com and based on
|
||||
# fixinc.wrap
|
||||
#
|
||||
# This script is designed for x86 with gnulibc of version 2.0 and less
|
||||
# for solution of problems with invalid asm-statements by creating
|
||||
# small wrappers around the include files containg the asm-statements.
|
||||
#
|
||||
# See README-fixinc for more information.
|
||||
|
||||
|
||||
# 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
|
||||
|
||||
# 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 fixed headers in ${LIB}
|
||||
|
||||
file=selectbits.h
|
||||
echo Fixed $file for glibc-2.0.x
|
||||
rm -f $LIB/$file
|
||||
cat <<'__EOF__' >$LIB/$file
|
||||
/* This file fixes __FD_ZERO bug for glibc-2.0.x. */
|
||||
#ifndef _SELECTBITS_H_WRAPPER
|
||||
#include <features.h>
|
||||
#include_next <selectbits.h>
|
||||
|
||||
#if defined(__FD_ZERO) && defined(__GLIBC__) && defined(__GLIBC_MINOR__) && __GLIBC__ == 2 && __GLIBC_MINOR__ == 0
|
||||
#undef __FD_ZERO
|
||||
#define __FD_ZERO(fdsetp) \
|
||||
do { \
|
||||
int __d0, __d1; \
|
||||
__asm__ __volatile__ ("cld; rep; stosl" \
|
||||
: "=m" (((__fd_mask *) \
|
||||
(fdsetp))[__FDELT (__FD_SETSIZE)]), \
|
||||
"=&c" (__d0), "=&D" (__d1) \
|
||||
: "a" (0), "1" (sizeof (__fd_set) \
|
||||
/ sizeof (__fd_mask)), \
|
||||
"2" ((__fd_mask *) (fdsetp)) \
|
||||
: "memory"); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#define _SELECTBITS_H_WRAPPER
|
||||
#endif /* _SELECTBITS_H_WRAPPER */
|
||||
__EOF__
|
||||
# Define _SELECTBITS_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 <selectbits.h>.
|
||||
chmod a+r $LIB/$file
|
||||
|
||||
# asm/posix_types.h for libc version 1.x
|
||||
file=asm/posix_types.h
|
||||
echo Fixed $file for glibc-1.x
|
||||
rm -f $LIB/$file
|
||||
dir=`dirname $LIB/$file`
|
||||
if [ ! -d $dir ]; then
|
||||
mkdir -p $dir || exit 1
|
||||
fi
|
||||
cat <<'__EOF__' >$LIB/$file
|
||||
/* This file fixes __FD_ZERO bug for glibc-1.x. */
|
||||
#ifndef _POSIX_TYPES_H_WRAPPER
|
||||
#include <features.h>
|
||||
#include_next <asm/posix_types.h>
|
||||
|
||||
#if defined(__FD_ZERO) && !defined(__GLIBC__)
|
||||
#undef __FD_ZERO
|
||||
#define __FD_ZERO(fdsetp) \
|
||||
do { \
|
||||
int __d0, __d1; \
|
||||
__asm__ __volatile__("cld ; rep ; stosl" \
|
||||
: "=m" (*(__kernel_fd_set *) (fdsetp)), \
|
||||
"=&c" (__d0), "=&D" (__d1) \
|
||||
: "a" (0), "1" (__FDSET_LONGS), \
|
||||
"2" ((__kernel_fd_set *) (fdsetp)) :"memory"); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#define _POSIX_TYPES_H_WRAPPER
|
||||
#endif /* _POSIX_TYPES_H_WRAPPER */
|
||||
__EOF__
|
||||
# Define _POSIX_TYPES_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 <asm/posix_types.h>.
|
||||
chmod a+r $LIB/$file
|
||||
|
||||
# gnu/types.h for libc version 1.x
|
||||
file=gnu/types.h
|
||||
echo Fixed $file for glibc-1.x
|
||||
rm -f $LIB/$file
|
||||
dir=`dirname $LIB/$file`
|
||||
if [ ! -d $dir ]; then
|
||||
mkdir -p $dir || exit 1
|
||||
fi
|
||||
cat <<'__EOF__' >$LIB/$file
|
||||
/* This file fixes __FD_ZERO bug for glibc-1.x. */
|
||||
#ifndef _TYPES_H_WRAPPER
|
||||
#include <features.h>
|
||||
#include_next <gnu/types.h>
|
||||
|
||||
#if defined(__FD_ZERO) && !defined(__GLIBC__)
|
||||
#undef __FD_ZERO
|
||||
# define __FD_ZERO(fdsetp) \
|
||||
do { \
|
||||
int __d0, __d1; \
|
||||
__asm__ __volatile__("cld ; rep ; stosl" \
|
||||
: "=m" (*(__fd_set *) (fdsetp)), \
|
||||
"=&c" (__d0), "=&D" (__d1) \
|
||||
: "a" (0), "1" (__FDSET_LONGS), \
|
||||
"2" ((__fd_set *) (fdsetp)) :"memory"); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#define _TYPES_H_WRAPPER
|
||||
#endif /* _TYPES_H_WRAPPER */
|
||||
__EOF__
|
||||
# Define _TYPES_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 <gnu/types.h>.
|
||||
chmod a+r $LIB/$file
|
||||
|
||||
exit 0
|
||||
|
||||
|
|
@ -1,834 +0,0 @@
|
|||
/*
|
||||
* $Id: fixincl.c,v 1.2 1999/01/13 22:56:21 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 1999/01/13 22:56:21 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);
|
||||
}
|
||||
|
|
@ -1,389 +0,0 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# DO NOT EDIT THIS FILE (fixincl.sh)
|
||||
#
|
||||
# It has been autogen-ed Friday October 16, 1998 at 07:29:49 AM PDT
|
||||
# From the definitions inclhack.def
|
||||
# and the template file inclhack.tpl
|
||||
#
|
||||
# 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 104 fixup scripts.
|
||||
#
|
||||
# See README-fixinc for more information.
|
||||
#
|
||||
# fixincludes 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.
|
||||
#
|
||||
# fixincludes 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 fixincludes. See the file "COPYING". If not,
|
||||
# write to: The Free Software Foundation, Inc.,
|
||||
# 59 Temple Place - Suite 330,
|
||||
# Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# # # # # # # # # # # # # # # # # # # # #
|
||||
#
|
||||
# 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}`
|
||||
FIXINCL=${ORIGDIR}/fixincl
|
||||
export FIXINCL
|
||||
|
||||
# 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}
|
||||
|
||||
required="$required `if $LINKS; then
|
||||
find . -name '*.h' \( -type f -o -type l \) -print
|
||||
else
|
||||
find . -name '*.h' -type f -print
|
||||
fi | ${FIXINCL}`"
|
||||
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
|
||||
|
||||
|
|
@ -1,169 +0,0 @@
|
|||
[= 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=]
|
||||
};
|
||||
4295
gcc/fixinc/fixincl.x
4295
gcc/fixinc/fixincl.x
File diff suppressed because it is too large
Load Diff
|
|
@ -1,186 +0,0 @@
|
|||
[= autogen template include =]
|
||||
[=
|
||||
# $Id: hackshell.tpl,v 1.2 1999/01/13 22:56:22 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
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,391 +0,0 @@
|
|||
[= autogen template -*- Mode: ksh -*-
|
||||
sh
|
||||
#
|
||||
# $Id: inclhack.tpl,v 1.2 1999/01/13 22:56:22 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=]
|
||||
|
|
@ -1,116 +0,0 @@
|
|||
#! /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 ../fixinc.sh
|
||||
cp $fixincludes ../fixinc.sh
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo $MAKE install
|
||||
$MAKE install || cp inclhack.sh ..
|
||||
5059
gcc/fixinc/regex.c
5059
gcc/fixinc/regex.c
File diff suppressed because it is too large
Load Diff
|
|
@ -1,504 +0,0 @@
|
|||
/* 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, 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* $Id: regex.h,v 1.3 1999/01/15 07:38: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:
|
||||
*/
|
||||
|
|
@ -1,464 +0,0 @@
|
|||
|
||||
/*
|
||||
* $Id: server.c,v 1.2 1999/01/13 22:56:23 law Exp $
|
||||
*
|
||||
* Server Handling copyright 1992-1998 Bruce Korb
|
||||
*
|
||||
* Server Handling is free software.
|
||||
* You may redistribute it and/or modify it under the terms of the
|
||||
* GNU General Public License, as published by the Free Software
|
||||
* Foundation; either version 2, or (at your option) any later version.
|
||||
*
|
||||
* Server Handling is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Server Handling. See the file "COPYING". If not,
|
||||
* write to: The Free Software Foundation, Inc.,
|
||||
* 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* As a special exception, Bruce Korb gives permission for additional
|
||||
* uses of the text contained in his release of ServerHandler.
|
||||
*
|
||||
* The exception is that, if you link the ServerHandler library with other
|
||||
* files to produce an executable, this does not by itself cause the
|
||||
* resulting executable to be covered by the GNU General Public License.
|
||||
* Your use of that executable is in no way restricted on account of
|
||||
* linking the ServerHandler library code into it.
|
||||
*
|
||||
* This exception does not however invalidate any other reasons why
|
||||
* the executable file might be covered by the GNU General Public License.
|
||||
*
|
||||
* This exception applies only to the code released by Bruce Korb under
|
||||
* the name ServerHandler. If you copy code from other sources under the
|
||||
* General Public License into a copy of ServerHandler, as the General Public
|
||||
* License permits, the exception does not apply to the code that you add
|
||||
* in this way. To avoid misleading anyone as to the status of such
|
||||
* modified files, you must delete this exception notice from them.
|
||||
*
|
||||
* If you write modifications of your own for ServerHandler, it is your
|
||||
* choice whether to permit this exception to apply to your modifications.
|
||||
* If you do not wish that, delete this exception notice.
|
||||
*/
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <sys/param.h>
|
||||
|
||||
#include "server.h"
|
||||
|
||||
#ifdef DEBUG
|
||||
#define STATIC
|
||||
#else
|
||||
#define STATIC static
|
||||
#endif
|
||||
#ifndef tSCC
|
||||
#define tSCC static const char
|
||||
#endif
|
||||
#ifndef NUL
|
||||
#define NUL '\0'
|
||||
#endif
|
||||
|
||||
STATIC bool readPipeTimeout;
|
||||
|
||||
STATIC tpChar defArgs[] =
|
||||
{(char *) NULL, "-p", (char *) NULL};
|
||||
STATIC tpfPair serverPair =
|
||||
{(FILE *) NULL, (FILE *) NULL};
|
||||
STATIC pid_t serverId = NULLPROCESS;
|
||||
/*
|
||||
* Arbitrary text that should not be found in the shell output.
|
||||
* It must be a single line and appear verbatim at the start of
|
||||
* the terminating output line.
|
||||
*/
|
||||
tSCC zDone[] = "ShElL-OuTpUt-HaS-bEeN-cOmPlEtEd";
|
||||
STATIC tpChar pCurDir = (char *) NULL;
|
||||
|
||||
/*
|
||||
* chainOpen
|
||||
*
|
||||
* Given an FD for an inferior process to use as stdin,
|
||||
* start that process and return a NEW FD that that process
|
||||
* will use for its stdout. Requires the argument vector
|
||||
* for the new process and, optionally, a pointer to a place
|
||||
* to store the child's process id.
|
||||
*/
|
||||
int
|
||||
chainOpen (stdinFd, ppArgs, pChild)
|
||||
int stdinFd;
|
||||
tpChar *ppArgs;
|
||||
pid_t *pChild;
|
||||
{
|
||||
tFdPair stdoutPair =
|
||||
{-1, -1};
|
||||
pid_t chId;
|
||||
char *pzCmd;
|
||||
|
||||
/*
|
||||
* Create a pipe it will be the child process' stdout,
|
||||
* and the parent will read from it.
|
||||
*/
|
||||
if ((pipe ((int *) &stdoutPair) < 0))
|
||||
{
|
||||
if (pChild != (pid_t *) NULL)
|
||||
*pChild = NOPROCESS;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we did not get an arg list, use the default
|
||||
*/
|
||||
if (ppArgs == (tpChar *) NULL)
|
||||
ppArgs = defArgs;
|
||||
|
||||
/*
|
||||
* If the arg list does not have a program,
|
||||
* assume the "SHELL" from the environment, or, failing
|
||||
* that, then sh. Set argv[0] to whatever we decided on.
|
||||
*/
|
||||
if (pzCmd = *ppArgs,
|
||||
(pzCmd == (char *) NULL) || (*pzCmd == '\0'))
|
||||
{
|
||||
|
||||
pzCmd = getenv ("SHELL");
|
||||
if (pzCmd == (char *) NULL)
|
||||
pzCmd = "sh";
|
||||
}
|
||||
#ifdef DEBUG_PRINT
|
||||
printf ("START: %s\n", pzCmd);
|
||||
{
|
||||
int idx = 0;
|
||||
while (ppArgs[++idx] != (char *) NULL)
|
||||
printf (" ARG %2d: %s\n", idx, ppArgs[idx]);
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
* Call fork() and see which process we become
|
||||
*/
|
||||
chId = fork ();
|
||||
switch (chId)
|
||||
{
|
||||
case NOPROCESS: /* parent - error in call */
|
||||
close (stdoutPair.readFd);
|
||||
close (stdoutPair.writeFd);
|
||||
if (pChild != (pid_t *) NULL)
|
||||
*pChild = NOPROCESS;
|
||||
return -1;
|
||||
|
||||
default: /* parent - return opposite FD's */
|
||||
if (pChild != (pid_t *) NULL)
|
||||
*pChild = chId;
|
||||
#ifdef DEBUG_PRINT
|
||||
printf ("for pid %d: stdin from %d, stdout to %d\n"
|
||||
"for parent: read from %d\n",
|
||||
chId, stdinFd, stdoutPair.writeFd, stdoutPair.readFd);
|
||||
#endif
|
||||
close (stdinFd);
|
||||
close (stdoutPair.writeFd);
|
||||
return stdoutPair.readFd;
|
||||
|
||||
case NULLPROCESS: /* child - continue processing */
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Close the pipe end handed back to the parent process
|
||||
*/
|
||||
close (stdoutPair.readFd);
|
||||
|
||||
/*
|
||||
* Close our current stdin and stdout
|
||||
*/
|
||||
close (STDIN_FILENO);
|
||||
close (STDOUT_FILENO);
|
||||
|
||||
/*
|
||||
* Make the fd passed in the stdin, and the write end of
|
||||
* the new pipe become the stdout.
|
||||
*/
|
||||
fcntl (stdoutPair.writeFd, F_DUPFD, STDOUT_FILENO);
|
||||
fcntl (stdinFd, F_DUPFD, STDIN_FILENO);
|
||||
|
||||
if (*ppArgs == (char *) NULL)
|
||||
*ppArgs = pzCmd;
|
||||
|
||||
execvp (pzCmd, ppArgs);
|
||||
fprintf (stderr, "Error %d: Could not execvp( '%s', ... ): %s\n",
|
||||
errno, pzCmd, strerror (errno));
|
||||
exit (EXIT_PANIC);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* p2open
|
||||
*
|
||||
* Given a pointer to an argument vector, start a process and
|
||||
* place its stdin and stdout file descriptors into an fd pair
|
||||
* structure. The "writeFd" connects to the inferior process
|
||||
* stdin, and the "readFd" connects to its stdout. The calling
|
||||
* process should write to "writeFd" and read from "readFd".
|
||||
* The return value is the process id of the created process.
|
||||
*/
|
||||
pid_t
|
||||
p2open (pPair, ppArgs)
|
||||
tFdPair *pPair;
|
||||
tpChar *ppArgs;
|
||||
{
|
||||
pid_t chId;
|
||||
|
||||
/*
|
||||
* Create a bi-directional pipe. Writes on 0 arrive on 1
|
||||
* and vice versa, so the parent and child processes will
|
||||
* read and write to opposite FD's.
|
||||
*/
|
||||
if (pipe ((int *) pPair) < 0)
|
||||
return NOPROCESS;
|
||||
|
||||
pPair->readFd = chainOpen (pPair->readFd, ppArgs, &chId);
|
||||
if (chId == NOPROCESS)
|
||||
close (pPair->writeFd);
|
||||
|
||||
return chId;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* p2fopen
|
||||
*
|
||||
* Identical to "p2open()", except that the "fd"'s are "fdopen(3)"-ed
|
||||
* into file pointers instead.
|
||||
*/
|
||||
pid_t
|
||||
p2fopen (pfPair, ppArgs)
|
||||
tpfPair *pfPair;
|
||||
tpChar *ppArgs;
|
||||
{
|
||||
tFdPair fdPair;
|
||||
pid_t chId = p2open (&fdPair, ppArgs);
|
||||
|
||||
if (chId == NOPROCESS)
|
||||
return chId;
|
||||
|
||||
pfPair->pfRead = fdopen (fdPair.readFd, "r");
|
||||
pfPair->pfWrite = fdopen (fdPair.writeFd, "w");
|
||||
return chId;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* loadData
|
||||
*
|
||||
* Read data from a file pointer (a pipe to a process in this context)
|
||||
* until we either get EOF or we get a marker line back.
|
||||
* The read data are stored in a malloc-ed string that is truncated
|
||||
* to size at the end. Input is assumed to be an ASCII string.
|
||||
*/
|
||||
STATIC char *
|
||||
loadData (fp)
|
||||
FILE *fp;
|
||||
{
|
||||
char *pzText;
|
||||
size_t textSize;
|
||||
char *pzScan;
|
||||
char zLine[1024];
|
||||
|
||||
textSize = sizeof (zLine) * 2;
|
||||
pzScan = \
|
||||
pzText = malloc (textSize);
|
||||
|
||||
if (pzText == (char *) NULL)
|
||||
return pzText;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
size_t usedCt;
|
||||
|
||||
alarm (10);
|
||||
readPipeTimeout = BOOL_FALSE;
|
||||
if (fgets (zLine, sizeof (zLine), fp) == (char *) NULL)
|
||||
break;
|
||||
|
||||
if (strncmp (zLine, zDone, sizeof (zDone) - 1) == 0)
|
||||
break;
|
||||
|
||||
strcpy (pzScan, zLine);
|
||||
pzScan += strlen (zLine);
|
||||
usedCt = (size_t) (pzScan - pzText);
|
||||
|
||||
if (textSize - usedCt < sizeof (zLine))
|
||||
{
|
||||
|
||||
size_t off = (size_t) (pzScan - pzText);
|
||||
void *p;
|
||||
textSize += 4096;
|
||||
p = realloc ((void *) pzText, textSize);
|
||||
if (p == (void *) NULL)
|
||||
{
|
||||
fprintf (stderr, "Failed to get 0x%08X bytes\n", textSize);
|
||||
free ((void *) pzText);
|
||||
return (char *) NULL;
|
||||
}
|
||||
|
||||
pzText = (char *) p;
|
||||
pzScan = pzText + off;
|
||||
}
|
||||
}
|
||||
|
||||
alarm (0);
|
||||
if (readPipeTimeout)
|
||||
{
|
||||
free ((void *) pzText);
|
||||
return (char *) NULL;
|
||||
}
|
||||
|
||||
while ((pzScan > pzText) && isspace (pzScan[-1]))
|
||||
pzScan--;
|
||||
*pzScan = NUL;
|
||||
return realloc ((void *) pzText, strlen (pzText) + 1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* SHELL SERVER PROCESS CODE
|
||||
*/
|
||||
|
||||
#ifdef DONT_HAVE_SIGSEND
|
||||
typedef enum
|
||||
{
|
||||
P_ALL, P_PID, P_GID, P_UID, P_PGID, P_SID, P_CID
|
||||
}
|
||||
idtype_t;
|
||||
typedef long id_t;
|
||||
|
||||
STATIC int
|
||||
sigsend (idtype, id, sig)
|
||||
idtype_t idtype;
|
||||
id_t id;
|
||||
int sig;
|
||||
{
|
||||
switch (idtype)
|
||||
{
|
||||
case P_PID:
|
||||
kill ((pid_t) id, sig);
|
||||
break;
|
||||
|
||||
case P_ALL:
|
||||
case P_GID:
|
||||
case P_UID:
|
||||
case P_PGID:
|
||||
case P_SID:
|
||||
case P_CID:
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
/*NOTREACHED */
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* HAVE_SIGSEND */
|
||||
|
||||
|
||||
STATIC void
|
||||
closeServer ()
|
||||
{
|
||||
kill( (pid_t) serverId, SIGKILL);
|
||||
serverId = NULLPROCESS;
|
||||
fclose (serverPair.pfRead);
|
||||
fclose (serverPair.pfWrite);
|
||||
serverPair.pfRead = serverPair.pfWrite = (FILE *) NULL;
|
||||
}
|
||||
|
||||
|
||||
struct sigaction savePipeAction;
|
||||
struct sigaction saveAlrmAction;
|
||||
struct sigaction currentAction;
|
||||
|
||||
STATIC void
|
||||
sigHandler (signo)
|
||||
int signo;
|
||||
{
|
||||
closeServer ();
|
||||
readPipeTimeout = BOOL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
STATIC void
|
||||
serverSetup ()
|
||||
{
|
||||
#ifndef SA_SIGINFO
|
||||
# define SA_SIGINFO 0
|
||||
#else
|
||||
currentAction.sa_sigaction =
|
||||
#endif
|
||||
currentAction.sa_handler = sigHandler;
|
||||
currentAction.sa_flags = SA_SIGINFO;
|
||||
sigemptyset( ¤tAction.sa_mask );
|
||||
|
||||
sigaction( SIGPIPE, ¤tAction, &savePipeAction );
|
||||
sigaction( SIGALRM, ¤tAction, &saveAlrmAction );
|
||||
atexit( &closeServer );
|
||||
|
||||
fputs ("trap : INT\n", serverPair.pfWrite);
|
||||
fflush (serverPair.pfWrite);
|
||||
pCurDir = getcwd ((char *) NULL, MAXPATHLEN + 1);
|
||||
}
|
||||
|
||||
|
||||
char *
|
||||
runShell (pzCmd)
|
||||
const char *pzCmd;
|
||||
{
|
||||
tSCC zNil[] = "";
|
||||
|
||||
/*
|
||||
* IF the shell server process is not running yet,
|
||||
* THEN try to start it.
|
||||
*/
|
||||
if (serverId == NULLPROCESS)
|
||||
{
|
||||
serverId = p2fopen (&serverPair, defArgs);
|
||||
if (serverId > 0)
|
||||
serverSetup ();
|
||||
}
|
||||
|
||||
/*
|
||||
* IF it is still not running,
|
||||
* THEN return the nil string.
|
||||
*/
|
||||
if (serverId <= 0)
|
||||
return (char *) zNil;
|
||||
|
||||
/*
|
||||
* Make sure the process will pay attention to us,
|
||||
* send the supplied command, and then
|
||||
* have it output a special marker that we can find.
|
||||
*/
|
||||
fprintf (serverPair.pfWrite, "\\cd %s\n%s\n\necho\necho %s\n",
|
||||
pCurDir, pzCmd, zDone);
|
||||
fflush (serverPair.pfWrite);
|
||||
if (serverId == NULLPROCESS)
|
||||
return (char *) NULL;
|
||||
|
||||
/*
|
||||
* Now try to read back all the data. If we fail due to either
|
||||
* a sigpipe or sigalrm (timeout), we will return the nil string.
|
||||
*/
|
||||
{
|
||||
char *pz = loadData (serverPair.pfRead);
|
||||
if (pz == (char *) NULL)
|
||||
{
|
||||
fprintf (stderr, "CLOSING SHELL SERVER - command failure:\n\t%s\n",
|
||||
pzCmd);
|
||||
closeServer ();
|
||||
pz = (char *) zNil;
|
||||
}
|
||||
return pz;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,94 +0,0 @@
|
|||
|
||||
/*
|
||||
* $Id: server.h,v 1.2 1999/01/13 22:56:23 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 */
|
||||
3214
gcc/fixincludes
3214
gcc/fixincludes
File diff suppressed because it is too large
Load Diff
294
gcc/fixproto
294
gcc/fixproto
|
|
@ -1,294 +0,0 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# SYNOPSIS
|
||||
# fixproto TARGET-DIR SOURCE-DIR-ALL SOURCE-DIR-STD
|
||||
#
|
||||
# COPYRIGHT
|
||||
# Copyright (C) 1993, 1994, 1997, 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.
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Adjunct script for GNU CC to populate a directory with ANSI,
|
||||
# Posix.1, and C++ compatible header files.
|
||||
#
|
||||
# Each file found under SOURCE-DIR-ALL is analyzed and "fixed."
|
||||
# Only standard ANSI/POSIX files found under SOURCE-DIR-STD
|
||||
# are analyzed and "fixed."
|
||||
# The SOURCE-DIRs are searched in order; a file found
|
||||
# under multiple SOURCE-DIRs is only handled for the first one.
|
||||
#
|
||||
# STRATEGY
|
||||
# Each include file is fed through cpp, and the scan-decls program
|
||||
# parses it, and emits any found function declarations.
|
||||
# The fix-header program analyzes the scan-decls output,
|
||||
# together with the original include file, and writes a "fixed"
|
||||
# include file, if needed.
|
||||
#
|
||||
# The comment at the beginning of fix-header.c lists specifically
|
||||
# what kind of changes are made.
|
||||
#
|
||||
# NOTE
|
||||
# Some file space will be wasted, because the original header
|
||||
# files are copied. An earlier version just included the original
|
||||
# by "reference", using GNU cpp's #include_next mechanism.
|
||||
# This is currently not done, partly because #include_next is
|
||||
# fragile (susceptible to version incompatibilities, and depends
|
||||
# and GCC-specific features), and partly for performance reasons.
|
||||
#
|
||||
# AUTHORS
|
||||
# Ron Guilmette (rfg@netcom.com) (original idea and code)
|
||||
# Per Bothner (bothner@cygnus.com) (major re-write)
|
||||
|
||||
progname=$0
|
||||
progname=`basename $progname`
|
||||
original_dir=`pwd`
|
||||
FIX_HEADER=${FIX_HEADER-$original_dir/fix-header}
|
||||
DEFINES="-D__STDC__=0 -D__cplusplus ${FIXPROTO_DEFINES}"
|
||||
|
||||
if [ `echo $1 | wc -w` = 0 ] ; then
|
||||
echo $progname\: usage\: $progname target-dir \[ source-dir \.\.\. \]
|
||||
exit 1
|
||||
fi
|
||||
|
||||
std_files="ctype.h dirent.h errno.h curses.h fcntl.h grp.h locale.h math.h pwd.h setjmp.h signal.h stdio.h stdlib.h string.h sys/socket.h sys/stat.h sys/times.h sys/resource.h sys/utsname.h sys/wait.h tar.h termios.h time.h unistd.h utime.h"
|
||||
|
||||
rel_target_dir=$1
|
||||
# All files in $src_dir_all (normally same as $rel_target_dir) are
|
||||
# processed.
|
||||
src_dir_all=$2
|
||||
# In $src_dir_std (normally same as /usr/include), only the
|
||||
# "standard" ANSI/POSIX files listed in $std_files are processed.
|
||||
src_dir_std=$3
|
||||
|
||||
if [ `expr $rel_target_dir : '\(.\)'` != '/' ] ; then
|
||||
abs_target_dir=$original_dir/$rel_target_dir
|
||||
else
|
||||
abs_target_dir=$rel_target_dir
|
||||
fi
|
||||
|
||||
# Determine whether this system has symbolic links.
|
||||
if ln -s X $rel_target_dir/ShouldNotExist 2>/dev/null; then
|
||||
rm -f $rel_target_dir/ShouldNotExist
|
||||
LINKS=true
|
||||
elif ln -s X /tmp/ShouldNotExist 2>/dev/null; then
|
||||
rm -f /tmp/ShouldNotExist
|
||||
LINKS=true
|
||||
else
|
||||
LINKS=false
|
||||
fi
|
||||
|
||||
if [ \! -d $abs_target_dir ] ; then
|
||||
echo $progname\: creating directory $rel_target_dir
|
||||
mkdir $abs_target_dir
|
||||
fi
|
||||
|
||||
echo $progname\: populating \`$rel_target_dir\'
|
||||
|
||||
include_path=""
|
||||
|
||||
if [ `echo $* | wc -w` != 0 ] ; then
|
||||
for rel_source_dir in $src_dir_all $src_dir_std; do
|
||||
if [ `expr $rel_source_dir : '\(.\)'` != '/' ] ; then
|
||||
abs_source_dir=$original_dir/$rel_source_dir
|
||||
else
|
||||
abs_source_dir=$rel_source_dir
|
||||
fi
|
||||
include_path="$include_path -I$abs_source_dir"
|
||||
done
|
||||
fi
|
||||
|
||||
required_stdlib_h="abort abs atexit atof atoi atol bsearch calloc exit free getenv labs malloc putenv qsort rand realloc srand strtod strtol strtoul system"
|
||||
# "div ldiv", - ignored because these depend on div_t, ldiv_t
|
||||
# ignore these: "mblen mbstowcs mbstowc wcstombs wctomb"
|
||||
# Left out getgroups, because SunOS4 has incompatible BSD and SVR4 versions.
|
||||
# Should perhaps also add NULL
|
||||
required_unistd_h="_exit access alarm chdir chown close ctermid cuserid dup dup2 execl execle execlp execv execve execvp fork fpathconf getcwd getegid geteuid getgid getlogin getopt getpgrp getpid getppid getuid isatty link lseek pathconf pause pipe read rmdir setgid setpgid setsid setuid sleep sysconf tcgetpgrp tcsetpgrp ttyname unlink write"
|
||||
|
||||
done_dirs=""
|
||||
subdirs_made=""
|
||||
echo "" >fixproto.list
|
||||
|
||||
for code in ALL STD ; do
|
||||
|
||||
subdirs="."
|
||||
|
||||
case $code in
|
||||
ALL)
|
||||
rel_source_dir=$src_dir_all
|
||||
|
||||
dirs="."
|
||||
levels=2
|
||||
while $LINKS && test -n "$dirs" -a $levels -gt 0
|
||||
do
|
||||
levels=`expr $levels - 1`
|
||||
newdirs=
|
||||
for d in $dirs ; do
|
||||
# Find all directories under $d, relative to $d, excluding $d itself.
|
||||
# Assume directory names ending in CC or containing ++ are
|
||||
# for C++, so skip those.
|
||||
subdirs="$subdirs "`cd $rel_source_dir/$d; find . -type d -print | \
|
||||
sed -e '/^\.$/d' -e "s|^\./|${d}/|" -e 's|^\./||' \
|
||||
-e '/CC$/d' -e '/[+][+]/d'`
|
||||
links=
|
||||
links=`cd $rel_source_dir; find $d/. -type l -print | \
|
||||
sed -e "s|$d/./|$d/|" -e 's|^\./||'`
|
||||
for link in $links --dummy-- ; do
|
||||
test -d $rel_source_dir/$link/. && newdirs="$newdirs $link"
|
||||
done
|
||||
done
|
||||
dirs="$newdirs"
|
||||
subdirs="$subdirs $newdirs"
|
||||
done
|
||||
;;
|
||||
STD)
|
||||
rel_source_dir=$src_dir_std
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ `expr $rel_source_dir : '\(.\)'` != '/' ] ; then
|
||||
abs_source_dir=$original_dir/$rel_source_dir
|
||||
else
|
||||
abs_source_dir=$rel_source_dir
|
||||
fi
|
||||
|
||||
if [ \! -d $abs_source_dir ] ; then
|
||||
echo $progname\: warning\: no such directory\: \`$rel_source_dir\'
|
||||
continue
|
||||
fi
|
||||
|
||||
for rel_source_subdir in $subdirs; do
|
||||
|
||||
abs_target_subdir=${abs_target_dir}/${rel_source_subdir}
|
||||
if [ \! -d $abs_target_subdir ] ; then
|
||||
if mkdir $abs_target_subdir ; then
|
||||
subdirs_made="$abs_target_subdir $subdirs_made"
|
||||
fi
|
||||
fi
|
||||
# Append "/"; remove initial "./". Hence "." -> "" and "sys" -> "sys/".
|
||||
rel_source_prefix=`echo $rel_source_subdir | sed -e 's|$|/|' -e 's|^./||'`
|
||||
|
||||
case $code in
|
||||
ALL)
|
||||
# The 'sed' is in case the *.h matches nothing, which yields "*.h"
|
||||
# which would then get re-globbed in the current directory. Sigh.
|
||||
rel_source_files=`cd ${abs_source_dir}/${rel_source_subdir}; echo *.h | sed -e 's|[*].h|NONE|'`
|
||||
;;
|
||||
|
||||
STD)
|
||||
files_to_check="$std_files"
|
||||
rel_source_files=""
|
||||
|
||||
# Also process files #included by the $std_files.
|
||||
while [ -n "${files_to_check}" ]
|
||||
do
|
||||
new_files_to_check=""
|
||||
for file in $files_to_check ; do
|
||||
xxfile=`echo $file | sed -e 's|/\([^/\.][^/\.]*\)/\.\./|/|'`
|
||||
# Create the dir where this file will go when fixed.
|
||||
xxdir=`echo ./$file | sed -e 's|/[^/]*$||'`
|
||||
if [ \! -d $abs_target_subdir/$xxdir ] ; then
|
||||
if mkdir $abs_target_subdir/$xxdir ; then
|
||||
subdirs_made="$abs_target_subdir/$xxdir $subdirs_made"
|
||||
fi
|
||||
fi
|
||||
# Just in case we have edited out a symbolic link
|
||||
if [ -f $src_dir_std/$file -a -f $src_dir_std/$xxfile ] ; then
|
||||
file=$xxfile
|
||||
fi
|
||||
case " $rel_source_files " in
|
||||
*" ${file} "*)
|
||||
# Already seen $file; nothing to do
|
||||
;;
|
||||
*)
|
||||
if test -f $src_dir_std/$file ; then
|
||||
rel_dir=`echo $file | sed -n -e 's|^\(.*/\)[^/]*$|\1|p'`
|
||||
# For #include "foo.h", that might be either "foo.h"
|
||||
# or "${rel_dir}foo.h (or something bogus).
|
||||
new_files_to_check="$new_files_to_check "`sed -n \
|
||||
-e 's@ @ @g' \
|
||||
-e 's@^ *# *include *<\([^>]*\)>.*$@\1@p' -e \
|
||||
's@^ *# *include *\"\([^\"]*\)\".*$@\1 '$rel_dir'\1@p'\
|
||||
<$src_dir_std/$file`
|
||||
rel_source_files="$rel_source_files $file"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done
|
||||
files_to_check="$new_files_to_check"
|
||||
done
|
||||
rel_source_files="$rel_source_files"
|
||||
;;
|
||||
esac
|
||||
|
||||
for filename in $rel_source_files ; do
|
||||
rel_source_file=${rel_source_prefix}${filename}
|
||||
abs_source_file=$abs_source_dir/$rel_source_file
|
||||
abs_target_file=$abs_target_dir/$rel_source_file
|
||||
|
||||
if test "$filename" = 'NONE' ; then
|
||||
echo "(No *.h files in $abs_source_dir/$rel_source_subdir)"
|
||||
# If target file exists, check if was written while processing one
|
||||
# of the earlier source directories; if so ignore it.
|
||||
elif test -f $abs_target_file -a -n "$done_dirs" \
|
||||
&& grep "$rel_source_file" fixproto.list >/dev/null
|
||||
then true
|
||||
else
|
||||
$FIX_HEADER $rel_source_file $abs_source_file $abs_target_file ${DEFINES} $include_path
|
||||
echo "${rel_source_file}" >>fixproto.list
|
||||
fi
|
||||
done
|
||||
done
|
||||
done_dirs="$done_dir $rel_source_dir"
|
||||
done
|
||||
|
||||
# This might be more cleanly moved into the main loop, by adding
|
||||
# a <dummy> source directory at the end. FIXME!
|
||||
for rel_source_file in unistd.h stdlib.h
|
||||
do
|
||||
if grep "$rel_source_file" fixproto.list >/dev/null
|
||||
then true
|
||||
else
|
||||
echo Adding missing $rel_source_file
|
||||
rel_source_ident=`echo $rel_source_file | tr ./ __`
|
||||
required_list=`eval echo '${required_'${rel_source_ident}'-}'`
|
||||
cat >tmp.h <<EOF
|
||||
#ifndef __${rel_source_ident}
|
||||
#define __${rel_source_ident}
|
||||
EOF
|
||||
if test $rel_source_file = stdlib.h
|
||||
then
|
||||
# Make sure it contains a definition of size_t.
|
||||
cat >>tmp.h <<EOF
|
||||
|
||||
#define __need_size_t
|
||||
#include <stddef.h>
|
||||
EOF
|
||||
fi
|
||||
cat >>tmp.h <<EOF
|
||||
|
||||
#endif /* __${rel_source_ident} */
|
||||
EOF
|
||||
${FIX_HEADER} $rel_source_file tmp.h $abs_target_dir/$rel_source_file ${DEFINES} $include_path
|
||||
rm tmp.h
|
||||
fi
|
||||
done
|
||||
|
||||
# Remove any directories that we made that are still empty.
|
||||
rmdir $subdirs_made 2>/dev/null
|
||||
|
||||
exit 0
|
||||
1373
gcc/gcov.c
1373
gcc/gcov.c
File diff suppressed because it is too large
Load Diff
344
gcc/gcov.texi
344
gcc/gcov.texi
|
|
@ -1,344 +0,0 @@
|
|||
@c Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
||||
@c This is part of the GCC manual.
|
||||
@c For copying conditions, see the file gcc.texi.
|
||||
|
||||
@node Gcov
|
||||
@chapter @code{gcov}: a Test Coverage Program
|
||||
|
||||
@code{gcov} is a tool you can use in conjunction with @sc{gnu} CC to
|
||||
test code coverage in your programs.
|
||||
|
||||
This chapter describes version 1.5 of @code{gcov}.
|
||||
|
||||
@menu
|
||||
* Gcov Intro:: Introduction to gcov.
|
||||
* Invoking Gcov:: How to use gcov.
|
||||
* Gcov and Optimization:: Using gcov with GCC optimization.
|
||||
* Gcov Data Files:: The files used by gcov.
|
||||
@end menu
|
||||
|
||||
@node Gcov Intro
|
||||
@section Introduction to @code{gcov}
|
||||
|
||||
@code{gcov} is a test coverage program. Use it in concert with @sc{gnu}
|
||||
CC to analyze your programs to help create more efficient, faster
|
||||
running code. You can use @code{gcov} as a profiling tool to help
|
||||
discover where your optimization efforts will best affect your code. You
|
||||
can also use @code{gcov} along with the other profiling tool,
|
||||
@code{gprof}, to assess which parts of your code use the greatest amount
|
||||
of computing time.
|
||||
|
||||
Profiling tools help you analyze your code's performance. Using a
|
||||
profiler such as @code{gcov} or @code{gprof}, you can find out some
|
||||
basic performance statistics, such as:
|
||||
|
||||
@itemize @bullet
|
||||
@item
|
||||
how often each line of code executes
|
||||
|
||||
@item
|
||||
what lines of code are actually executed
|
||||
|
||||
@item
|
||||
how much computing time each section of code uses
|
||||
@end itemize
|
||||
|
||||
Once you know these things about how your code works when compiled, you
|
||||
can look at each module to see which modules should be optimized.
|
||||
@code{gcov} helps you determine where to work on optimization.
|
||||
|
||||
Software developers also use coverage testing in concert with
|
||||
testsuites, to make sure software is actually good enough for a release.
|
||||
Testsuites can verify that a program works as expected; a coverage
|
||||
program tests to see how much of the program is exercised by the
|
||||
testsuite. Developers can then determine what kinds of test cases need
|
||||
to be added to the testsuites to create both better testing and a better
|
||||
final product.
|
||||
|
||||
You should compile your code without optimization if you plan to use
|
||||
@code{gcov} because the optimization, by combining some lines of code
|
||||
into one function, may not give you as much information as you need to
|
||||
look for `hot spots' where the code is using a great deal of computer
|
||||
time. Likewise, because @code{gcov} accumulates statistics by line (at
|
||||
the lowest resolution), it works best with a programming style that
|
||||
places only one statement on each line. If you use complicated macros
|
||||
that expand to loops or to other control structures, the statistics are
|
||||
less helpful---they only report on the line where the macro call
|
||||
appears. If your complex macros behave like functions, you can replace
|
||||
them with inline functions to solve this problem.
|
||||
|
||||
@code{gcov} creates a logfile called @file{@var{sourcefile}.gcov} which
|
||||
indicates how many times each line of a source file @file{@var{sourcefile}.c}
|
||||
has executed. You can use these logfiles along with @code{gprof} to aid
|
||||
in fine-tuning the performance of your programs. @code{gprof} gives
|
||||
timing information you can use along with the information you get from
|
||||
@code{gcov}.
|
||||
|
||||
@code{gcov} works only on code compiled with @sc{gnu} CC. It is not
|
||||
compatible with any other profiling or test coverage mechanism.
|
||||
|
||||
@node Invoking Gcov
|
||||
@section Invoking gcov
|
||||
|
||||
@smallexample
|
||||
gcov [-b] [-v] [-n] [-l] [-f] [-o directory] @var{sourcefile}
|
||||
@end smallexample
|
||||
|
||||
@table @code
|
||||
@item -b
|
||||
Write branch frequencies to the output file, and write branch summary
|
||||
info to the standard output. This option allows you to see how often
|
||||
each branch in your program was taken.
|
||||
|
||||
@item -v
|
||||
Display the @code{gcov} version number (on the standard error stream).
|
||||
|
||||
@item -n
|
||||
Do not create the @code{gcov} output file.
|
||||
|
||||
@item -l
|
||||
Create long file names for included source files. For example, if the
|
||||
header file @samp{x.h} contains code, and was included in the file
|
||||
@samp{a.c}, then running @code{gcov} on the file @samp{a.c} will produce
|
||||
an output file called @samp{a.c.x.h.gcov} instead of @samp{x.h.gcov}.
|
||||
This can be useful if @samp{x.h} is included in multiple source files.
|
||||
|
||||
@item -f
|
||||
Output summaries for each function in addition to the file level summary.
|
||||
|
||||
@item -o
|
||||
The directory where the object files live. Gcov will search for @code{.bb},
|
||||
@code{.bbg}, and @code{.da} files in this directory.
|
||||
@end table
|
||||
|
||||
@need 3000
|
||||
When using @code{gcov}, you must first compile your program with two
|
||||
special @sc{gnu} CC options: @samp{-fprofile-arcs -ftest-coverage}.
|
||||
This tells the compiler to generate additional information needed by
|
||||
gcov (basically a flow graph of the program) and also includes
|
||||
additional code in the object files for generating the extra profiling
|
||||
information needed by gcov. These additional files are placed in the
|
||||
directory where the source code is located.
|
||||
|
||||
Running the program will cause profile output to be generated. For each
|
||||
source file compiled with -fprofile-arcs, an accompanying @code{.da}
|
||||
file will be placed in the source directory.
|
||||
|
||||
Running @code{gcov} with your program's source file names as arguments
|
||||
will now produce a listing of the code along with frequency of execution
|
||||
for each line. For example, if your program is called @samp{tmp.c}, this
|
||||
is what you see when you use the basic @code{gcov} facility:
|
||||
|
||||
@smallexample
|
||||
$ gcc -fprofile-arcs -ftest-coverage tmp.c
|
||||
$ a.out
|
||||
$ gcov tmp.c
|
||||
87.50% of 8 source lines executed in file tmp.c
|
||||
Creating tmp.c.gcov.
|
||||
@end smallexample
|
||||
|
||||
The file @file{tmp.c.gcov} contains output from @code{gcov}.
|
||||
Here is a sample:
|
||||
|
||||
@smallexample
|
||||
main()
|
||||
@{
|
||||
1 int i, total;
|
||||
|
||||
1 total = 0;
|
||||
|
||||
11 for (i = 0; i < 10; i++)
|
||||
10 total += i;
|
||||
|
||||
1 if (total != 45)
|
||||
###### printf ("Failure\n");
|
||||
else
|
||||
1 printf ("Success\n");
|
||||
1 @}
|
||||
@end smallexample
|
||||
|
||||
@need 450
|
||||
When you use the @samp{-b} option, your output looks like this:
|
||||
|
||||
@smallexample
|
||||
$ gcov -b tmp.c
|
||||
87.50% of 8 source lines executed in file tmp.c
|
||||
80.00% of 5 branches executed in file tmp.c
|
||||
80.00% of 5 branches taken at least once in file tmp.c
|
||||
50.00% of 2 calls executed in file tmp.c
|
||||
Creating tmp.c.gcov.
|
||||
@end smallexample
|
||||
|
||||
Here is a sample of a resulting @file{tmp.c.gcov} file:
|
||||
|
||||
@smallexample
|
||||
main()
|
||||
@{
|
||||
1 int i, total;
|
||||
|
||||
1 total = 0;
|
||||
|
||||
11 for (i = 0; i < 10; i++)
|
||||
branch 0 taken = 91%
|
||||
branch 1 taken = 100%
|
||||
branch 2 taken = 100%
|
||||
10 total += i;
|
||||
|
||||
1 if (total != 45)
|
||||
branch 0 taken = 100%
|
||||
###### printf ("Failure\n");
|
||||
call 0 never executed
|
||||
branch 1 never executed
|
||||
else
|
||||
1 printf ("Success\n");
|
||||
call 0 returns = 100%
|
||||
1 @}
|
||||
@end smallexample
|
||||
|
||||
For each basic block, a line is printed after the last line of the basic
|
||||
block describing the branch or call that ends the basic block. There can
|
||||
be multiple branches and calls listed for a single source line if there
|
||||
are multiple basic blocks that end on that line. In this case, the
|
||||
branches and calls are each given a number. There is no simple way to map
|
||||
these branches and calls back to source constructs. In general, though,
|
||||
the lowest numbered branch or call will correspond to the leftmost construct
|
||||
on the source line.
|
||||
|
||||
For a branch, if it was executed at least once, then a percentage
|
||||
indicating the number of times the branch was taken divided by the
|
||||
number of times the branch was executed will be printed. Otherwise, the
|
||||
message ``never executed'' is printed.
|
||||
|
||||
For a call, if it was executed at least once, then a percentage
|
||||
indicating the number of times the call returned divided by the number
|
||||
of times the call was executed will be printed. This will usually be
|
||||
100%, but may be less for functions call @code{exit} or @code{longjmp},
|
||||
and thus may not return everytime they are called.
|
||||
|
||||
The execution counts are cumulative. If the example program were
|
||||
executed again without removing the @code{.da} file, the count for the
|
||||
number of times each line in the source was executed would be added to
|
||||
the results of the previous run(s). This is potentially useful in
|
||||
several ways. For example, it could be used to accumulate data over a
|
||||
number of program runs as part of a test verification suite, or to
|
||||
provide more accurate long-term information over a large number of
|
||||
program runs.
|
||||
|
||||
The data in the @code{.da} files is saved immediately before the program
|
||||
exits. For each source file compiled with -fprofile-arcs, the profiling
|
||||
code first attempts to read in an existing @code{.da} file; if the file
|
||||
doesn't match the executable (differing number of basic block counts) it
|
||||
will ignore the contents of the file. It then adds in the new execution
|
||||
counts and finally writes the data to the file.
|
||||
|
||||
@node Gcov and Optimization
|
||||
@section Using @code{gcov} with GCC Optimization
|
||||
|
||||
If you plan to use @code{gcov} to help optimize your code, you must
|
||||
first compile your program with two special @sc{gnu} CC options:
|
||||
@samp{-fprofile-arcs -ftest-coverage}. Aside from that, you can use any
|
||||
other @sc{gnu} CC options; but if you want to prove that every single line
|
||||
in your program was executed, you should not compile with optimization
|
||||
at the same time. On some machines the optimizer can eliminate some
|
||||
simple code lines by combining them with other lines. For example, code
|
||||
like this:
|
||||
|
||||
@smallexample
|
||||
if (a != b)
|
||||
c = 1;
|
||||
else
|
||||
c = 0;
|
||||
@end smallexample
|
||||
|
||||
@noindent
|
||||
can be compiled into one instruction on some machines. In this case,
|
||||
there is no way for @code{gcov} to calculate separate execution counts
|
||||
for each line because there isn't separate code for each line. Hence
|
||||
the @code{gcov} output looks like this if you compiled the program with
|
||||
optimization:
|
||||
|
||||
@smallexample
|
||||
100 if (a != b)
|
||||
100 c = 1;
|
||||
100 else
|
||||
100 c = 0;
|
||||
@end smallexample
|
||||
|
||||
The output shows that this block of code, combined by optimization,
|
||||
executed 100 times. In one sense this result is correct, because there
|
||||
was only one instruction representing all four of these lines. However,
|
||||
the output does not indicate how many times the result was 0 and how
|
||||
many times the result was 1.
|
||||
|
||||
@node Gcov Data Files
|
||||
@section Brief description of @code{gcov} data files
|
||||
|
||||
@code{gcov} uses three files for doing profiling. The names of these
|
||||
files are derived from the original @emph{source} file by substituting
|
||||
the file suffix with either @code{.bb}, @code{.bbg}, or @code{.da}. All
|
||||
of these files are placed in the same directory as the source file, and
|
||||
contain data stored in a platform-independent method.
|
||||
|
||||
The @code{.bb} and @code{.bbg} files are generated when the source file
|
||||
is compiled with the @sc{gnu} CC @samp{-ftest-coverage} option. The
|
||||
@code{.bb} file contains a list of source files (including headers),
|
||||
functions within those files, and line numbers corresponding to each
|
||||
basic block in the source file.
|
||||
|
||||
The @code{.bb} file format consists of several lists of 4-byte integers
|
||||
which correspond to the line numbers of each basic block in the
|
||||
file. Each list is terminated by a line number of 0. A line number of -1
|
||||
is used to designate that the source file name (padded to a 4-byte
|
||||
boundary and followed by another -1) follows. In addition, a line number
|
||||
of -2 is used to designate that the name of a function (also padded to a
|
||||
4-byte boundary and followed by a -2) follows.
|
||||
|
||||
The @code{.bbg} file is used to reconstruct the program flow graph for
|
||||
the source file. It contains a list of the program flow arcs (possible
|
||||
branches taken from one basic block to another) for each function which,
|
||||
in combination with the @code{.bb} file, enables gcov to reconstruct the
|
||||
program flow.
|
||||
|
||||
In the @code{.bbg} file, the format is:
|
||||
@smallexample
|
||||
number of basic blocks for function #0 (4-byte number)
|
||||
total number of arcs for function #0 (4-byte number)
|
||||
count of arcs in basic block #0 (4-byte number)
|
||||
destination basic block of arc #0 (4-byte number)
|
||||
flag bits (4-byte number)
|
||||
destination basic block of arc #1 (4-byte number)
|
||||
flag bits (4-byte number)
|
||||
...
|
||||
destination basic block of arc #N (4-byte number)
|
||||
flag bits (4-byte number)
|
||||
count of arcs in basic block #1 (4-byte number)
|
||||
destination basic block of arc #0 (4-byte number)
|
||||
flag bits (4-byte number)
|
||||
...
|
||||
@end smallexample
|
||||
|
||||
A -1 (stored as a 4-byte number) is used to separate each function's
|
||||
list of basic blocks, and to verify that the file has been read
|
||||
correctly.
|
||||
|
||||
The @code{.da} file is generated when a program containing object files
|
||||
built with the @sc{gnu} CC @samp{-fprofile-arcs} option is executed. A
|
||||
separate @code{.da} file is created for each source file compiled with
|
||||
this option, and the name of the @code{.da} file is stored as an
|
||||
absolute pathname in the resulting object file. This path name is
|
||||
derived from the source file name by substituting a @code{.da} suffix.
|
||||
|
||||
The format of the @code{.da} file is fairly simple. The first 8-byte
|
||||
number is the number of counts in the file, followed by the counts
|
||||
(stored as 8-byte numbers). Each count corresponds to the number of
|
||||
times each arc in the program is executed. The counts are cumulative;
|
||||
each time the program is executed, it attemps to combine the existing
|
||||
@code{.da} files with the new counts for this invocation of the
|
||||
program. It ignores the contents of any @code{.da} files whose number of
|
||||
arcs doesn't correspond to the current program, and merely overwrites
|
||||
them instead.
|
||||
|
||||
All three of these files use the functions in @code{gcov-io.h} to store
|
||||
integers; the functions in this header provide a machine-independent
|
||||
mechanism for storing and retrieving data from a stream.
|
||||
|
||||
904
gcc/proto-man
904
gcc/proto-man
|
|
@ -1,904 +0,0 @@
|
|||
#ifndef UNPRO
|
||||
#define THISPROG PROTOIZE
|
||||
#define thisprog protoize
|
||||
#define Thisprog Protoize
|
||||
#define otherprog unprotoize
|
||||
#define from_convention varargs
|
||||
#define to_convention stdarg
|
||||
#else
|
||||
#define THISPROG UNPROTOIZE
|
||||
#define thisprog unprotoize
|
||||
#define Thisprog Unprotoize
|
||||
#define otherprog protoize
|
||||
#define from_convention stdarg
|
||||
#define to_convention varargs
|
||||
#endif
|
||||
.\" Man page file for the thisprog program.
|
||||
.\" This is badly out of date, especially concerning
|
||||
.\" the way of deciding which files to convert.
|
||||
.\" Really all this information should be updated and put in gcc.texinfo.
|
||||
.\"
|
||||
.\" Written by Ron Guilmette (rfg@mcc.com).
|
||||
.\"
|
||||
.\" Copyright (C) 1989, 1990 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 1, 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, 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
.\"
|
||||
.TH THISPROG 1 "21 January 1990" ""
|
||||
.SH NAME
|
||||
#ifndef UNPRO
|
||||
thisprog \- convert K&R C source code to ANSI C prototype format
|
||||
#else
|
||||
thisprog \- convert ANSI C source code to K&R C (unprototyped) format
|
||||
#endif
|
||||
.SH SYNOPSIS
|
||||
.B thisprog
|
||||
[
|
||||
#ifndef UNPRO
|
||||
.B -VqfnkNlgC
|
||||
] [
|
||||
.B -B
|
||||
.I <dir>
|
||||
#else
|
||||
.B -VqfnkN
|
||||
] [
|
||||
.B -i
|
||||
.I <str>
|
||||
#endif
|
||||
] [
|
||||
.B -c
|
||||
.I <cc opts>
|
||||
] [
|
||||
.I file\c
|
||||
\&... ]
|
||||
.SH DESCRIPTION
|
||||
.fi
|
||||
.ad b
|
||||
.I Thisprog
|
||||
aids in the conversion of
|
||||
#ifndef UNPRO
|
||||
K&R C source code files to ANSI C source code files with function prototypes.
|
||||
This conversion is useful for eliciting more complete
|
||||
interface checking from ANSI C compilers, or as
|
||||
a preliminary step in the conversion of C programs to C++.
|
||||
#else
|
||||
ANSI C source code files to K&R C source code files without function prototypes
|
||||
.
|
||||
This conversion is useful for porting ANSI C programs to
|
||||
machines for which no ANSI C compiler is available.
|
||||
#endif
|
||||
.PP
|
||||
.I Thisprog
|
||||
is designed to be used in conjunction
|
||||
with the GNU C compiler. The GNU C compiler does preliminary
|
||||
.I "information gathering"
|
||||
about functions by analyzing the files to be converted.
|
||||
The GNU C compiler may be invoked automatically as a result of
|
||||
running
|
||||
.I thisprog
|
||||
so it is important to have it properly installed before attempting
|
||||
to convert source files via
|
||||
.I thisprog.
|
||||
#ifndef UNPRO
|
||||
.PP
|
||||
.I Thisprog
|
||||
actually has two primary functions. First, It converts
|
||||
existing function declarations and definitions
|
||||
to prototype form.
|
||||
Second, for cases in which functions
|
||||
are called before they have been declared
|
||||
(i.e. points of
|
||||
.I implicit
|
||||
function declarations),
|
||||
.I thisprog
|
||||
can be instructed to
|
||||
insert new prototype style function declarations
|
||||
into the source code.
|
||||
For implicit function declarations,
|
||||
.I thisprog
|
||||
can either
|
||||
insert the new (explicit) function declaration
|
||||
at the very beginning of the block which contains
|
||||
the implicit declaration, or (at the user\'s option)
|
||||
these explicit declarations can be inserted near the tops of the
|
||||
source files where the implicit declarations occurred.
|
||||
The insertion of these new (explicit) function
|
||||
declarations (by thisprog) assures that
|
||||
.B all
|
||||
function calls in your source files will be
|
||||
checked for the correct
|
||||
number and types of parameters
|
||||
during subsequent compilations.
|
||||
#endif
|
||||
.PP
|
||||
.I Thisprog
|
||||
supports the conversion of both large and small systems of C source
|
||||
code to
|
||||
#ifndef UNPRO
|
||||
prototype
|
||||
#else
|
||||
unprototyped
|
||||
#endif
|
||||
form.
|
||||
.I Thisprog
|
||||
can perform the conversion of an
|
||||
entire program in one (batch) step.
|
||||
#ifndef UNPRO
|
||||
.PP
|
||||
.I Thisprog
|
||||
is able to convert entire systems of C source code because
|
||||
it knows how to use information (gleaned by the C compiler) from one
|
||||
source file to convert
|
||||
function definitions and declarations in that same source file or in
|
||||
other source files (as required).
|
||||
#endif
|
||||
.PP
|
||||
Each conversion of a system of source code to
|
||||
#ifndef UNPRO
|
||||
prototyped
|
||||
#else
|
||||
unprototyped
|
||||
#endif
|
||||
format consists of two major steps. First, there is an
|
||||
.I "information gathering"
|
||||
step. In this step,
|
||||
all of the source files that make up a given
|
||||
executable program are recompiled using the GNU C compiler and using the
|
||||
.B -fgen-aux-info
|
||||
option.
|
||||
These recompilations will be performed automatically by
|
||||
.I thisprog
|
||||
on an
|
||||
.I as needed
|
||||
basis.
|
||||
.PP
|
||||
As individual compilation steps are performed, you may notice
|
||||
that a side-effect of these compilations is to create files with a
|
||||
.B .X
|
||||
suffix in the same directory with the original
|
||||
.I base
|
||||
source files being compiled.
|
||||
During compilation with
|
||||
.B -fgen-aux-info,
|
||||
one such
|
||||
.B .X
|
||||
file is created for
|
||||
each
|
||||
.I base
|
||||
source file compiled. These files contain
|
||||
information about function definitions and declarations and
|
||||
additional coded information which can be used by
|
||||
.I thisprog
|
||||
to convert your source code
|
||||
automatically to
|
||||
#ifndef UNPRO
|
||||
prototyped
|
||||
#else
|
||||
unprototyped
|
||||
#endif
|
||||
format.
|
||||
.PP
|
||||
After a full set of
|
||||
.B .X
|
||||
files corresponding to all of the
|
||||
.B .c
|
||||
(i.e.
|
||||
.I base
|
||||
source) files for an individual
|
||||
program
|
||||
have been created,
|
||||
.I thisprog
|
||||
performs the actual conversion step.
|
||||
.PP
|
||||
Execution of the
|
||||
.I thisprog
|
||||
program causes your original source files to be converted such that both
|
||||
their function declarations and their function definitions are in
|
||||
#ifndef UNPRO
|
||||
prototyped
|
||||
#else
|
||||
unprototyped
|
||||
#endif
|
||||
format.
|
||||
After the conversion of your system, you will be
|
||||
left with a set of similar (but converted) source files
|
||||
with the same names as your original files.
|
||||
.PP
|
||||
Before it writes each converted file back to disk,
|
||||
.I thisprog
|
||||
attempts to rename the original file, giving it a
|
||||
.B .save
|
||||
suffix.
|
||||
It then creates a new output file
|
||||
with the same name that the original file had.
|
||||
This ensures that if there were any hard links to the original
|
||||
input files, these will not be altered by the conversion process.
|
||||
.PP
|
||||
WARNING! If for any given original file, a save file already exists,
|
||||
.I thisprog
|
||||
will assume that the existing save file contains a backup of the
|
||||
original file as it existed before any conversions were applied.
|
||||
Thus, if there is an existing save file,
|
||||
.I thisprog
|
||||
will not overwrite this existing save file, and no new backup of
|
||||
that particular original file will be made during that run of
|
||||
.I thisprog.
|
||||
.PP
|
||||
An important safety feature of
|
||||
.I thisprog
|
||||
is that it normally only tries to convert files for which you have both
|
||||
read and write permissions. Also,
|
||||
.I thisprog
|
||||
will normally only convert files located in directories that you
|
||||
have both search and write permissions for.
|
||||
.PP
|
||||
Another safety feature is that
|
||||
.I thisprog
|
||||
will not normally convert files which
|
||||
are located in
|
||||
.I system
|
||||
include directories.
|
||||
A
|
||||
.I system
|
||||
include directory is defined by
|
||||
.I thisprog
|
||||
as either
|
||||
.B /usr/include
|
||||
(or any of its subdirectories)
|
||||
or a directory whose full absolute pathname includes
|
||||
either
|
||||
.B gcc-include
|
||||
or
|
||||
.B g++-include.
|
||||
.PP
|
||||
Most of the above safety features can be overridden by using the
|
||||
.B \-f
|
||||
(force) option (see below),
|
||||
but even when
|
||||
.B \-f
|
||||
is used, you cannot force the conversion of files for which you
|
||||
do not at least have read permission, or files in directories that you do not
|
||||
at least have write permission for.
|
||||
.PP
|
||||
Note that
|
||||
.I thisprog
|
||||
will make no attempt to convert definitions
|
||||
#ifndef UNPRO
|
||||
or declarations
|
||||
#endif
|
||||
of functions which accept a variable number of arguments
|
||||
and which are written using the
|
||||
.I from_convention
|
||||
conventions.
|
||||
All such function definitions
|
||||
#ifndef UNPRO
|
||||
and declarations
|
||||
#endif
|
||||
must be converted manually to the
|
||||
.I to_convention
|
||||
conventions.
|
||||
Warnings are automatically issued for
|
||||
.I from_convention
|
||||
function definitions
|
||||
#ifndef UNPRO
|
||||
and declarations
|
||||
#endif
|
||||
which are left unconverted by
|
||||
.I thisprog.
|
||||
.SH OPTIONS
|
||||
.I Thisprog
|
||||
recognizes the following options:
|
||||
.TP
|
||||
.B \-V
|
||||
Version number. Causes the current version number to be
|
||||
printed on stderr.
|
||||
.TP
|
||||
.B \-q
|
||||
Quiet mode.
|
||||
Normally,
|
||||
.I thisprog
|
||||
may issue many verbose warnings concerning noteworthy conditions.
|
||||
These warnings can often be helpful to the overall conversion effort.
|
||||
Users who prefer not to see such messages can use the
|
||||
.B \-q
|
||||
option which suppresses most such warnings.
|
||||
.TP
|
||||
.B \-f
|
||||
Force mode.
|
||||
Use of this option overrides the normal safety
|
||||
features of
|
||||
.I thisprog.
|
||||
It allows for attempts to convert system include files,
|
||||
and files not writable by you.
|
||||
These conversions are still subject to all normal
|
||||
file protections provided by the operating system.
|
||||
This option should be used only with extreme caution.
|
||||
It can be especially dangerous to use this option when logged on as
|
||||
.I root.
|
||||
Note that when this option is used, you are allowed to convert even files
|
||||
that you do not have write access to. So long as you have write access
|
||||
to the containing directory, conversion may occur.
|
||||
.TP
|
||||
.B \-n
|
||||
No convert mode. Do not actually perform any conversions on base source files
|
||||
or on include files. Rather, simply do all steps leading up to conversion
|
||||
and then print a list (to stdout) of the names of all files which would
|
||||
actually be modified if the conversions were actually performed. This option
|
||||
may be useful to you if you are converting a system of source files
|
||||
that you are unfamiliar with. In such cases, you may need to verify
|
||||
ahead of time that include files which belong to other people or to
|
||||
other projects will not be modified by running
|
||||
.I thisprog.
|
||||
Use of this option also implicitly enables
|
||||
.I keep mode.
|
||||
(See the
|
||||
.B \-k
|
||||
option below.)
|
||||
.TP
|
||||
.B \-k
|
||||
Keep mode. Normally,
|
||||
.I thisprog
|
||||
reads the information in the
|
||||
.B .X
|
||||
files created by the GNU C compiler, and then
|
||||
immediately deletes these files (since they will no longer be
|
||||
valid or useful after conversion). When the
|
||||
.B \-k
|
||||
option is used however, the
|
||||
.B .X
|
||||
files are not deleted during conversion.
|
||||
.TP
|
||||
.B -N
|
||||
No save mode. When this option is used, no attempt is made to
|
||||
make backups of original files (by renaming them such that they have
|
||||
an added
|
||||
.B .save
|
||||
suffix).
|
||||
Use this option with extreme caution, and
|
||||
only when you have previously backed up
|
||||
all of the files that might be converted
|
||||
by running
|
||||
.I thisprog.
|
||||
(See the
|
||||
.B -n
|
||||
option above.)
|
||||
.TP
|
||||
.B \-c <cc opts>
|
||||
Specify compile options. The
|
||||
.B \-c
|
||||
option can be used as a means of passing on important compilation
|
||||
options to the C compiler. It may often be necessary to use this option
|
||||
to pass command line preprocessor definitions on to the compilation step.
|
||||
Note that The compile options must be given as a single argument to
|
||||
.I thisprog.
|
||||
If you have more than one
|
||||
compilation option, you will have to quote the entire set of
|
||||
compilation options in order to keep the shell from treating
|
||||
them as separate arguments to
|
||||
.I thisprog.
|
||||
Note also that certain options are automatically suppressed by
|
||||
.I thisprog
|
||||
and cannot be passed on to the compiler (i.e.
|
||||
.B "-g, -O, -c, -S,"
|
||||
and
|
||||
.B "-o"
|
||||
are suppressed).
|
||||
#ifndef UNPRO
|
||||
.TP
|
||||
.B \-C
|
||||
C++ conversion mode.
|
||||
Normally,
|
||||
.I thisprog
|
||||
writes its (converted) output files back to files of the same names
|
||||
as the original (unconverted) input files.
|
||||
In C++ conversion mode,
|
||||
after each output file is written,
|
||||
a check is made to see if the given output file has a
|
||||
.B .c
|
||||
suffix. If it does, then the given file is renamed, and its suffix
|
||||
is changed to
|
||||
.B .C.
|
||||
This makes the output file
|
||||
acceptable as a C++ input file for either the GNU C++ compiler or
|
||||
for the Cfront translator.
|
||||
.TP
|
||||
.B \-l
|
||||
Add explicit local declarations. This option causes
|
||||
.I thisprog
|
||||
to insert
|
||||
explicit declarations for functions that were only implicitly declared
|
||||
in the original source code. When the
|
||||
.B \-l
|
||||
option is used, lists of additional new
|
||||
explicit function declarations are inserted near the
|
||||
starts of blocks where explicit function declarations took place.
|
||||
(See also the
|
||||
.B \-g
|
||||
option below.)
|
||||
.TP
|
||||
.B \-g
|
||||
Add explicit global declarations. This option causes
|
||||
.I thisprog
|
||||
to insert
|
||||
explicit declarations for functions that were only implicitly declared
|
||||
in your original source code. When the
|
||||
.B \-g
|
||||
option is used, a list of additional new
|
||||
explicit function declarations is inserted just before the
|
||||
first function definition in each individual source file that previously
|
||||
contained implicit declarations.
|
||||
(See also the
|
||||
.B \-l
|
||||
option above.)
|
||||
.TP
|
||||
.B \-B <dir>
|
||||
Alternate library directory option. Use this option to specify that
|
||||
.I thisprog
|
||||
should attempt to find the file
|
||||
.B SYSCALLS.c.X
|
||||
in the alternate directory indicated in the option.
|
||||
#else
|
||||
.TP
|
||||
.B \-i <str>
|
||||
Indent string option.
|
||||
This option can be used to specify a string to use when indenting
|
||||
lines containing declarations for formal parameter variables.
|
||||
The default indentation string for such lines is a sequence of five spaces
|
||||
(i.e.\ GNU style indentation) but you may use this option to specify
|
||||
any other string that you like (e.g.\ a tab character).
|
||||
Note that
|
||||
the shell has its own interpretations for blanks and tabs, so you
|
||||
will generally have to quotes the argument given in the
|
||||
.B -i
|
||||
option.
|
||||
#endif
|
||||
.SH EXAMPLES
|
||||
Assume that you have
|
||||
a directory with
|
||||
all of the files for your system in it. Also
|
||||
assume that your system consists of two
|
||||
executable programs, one built from the files
|
||||
.B s1.c, s2.c,
|
||||
and
|
||||
.B s3.c,
|
||||
and the other built from the files
|
||||
.B s4.c
|
||||
and
|
||||
.B s5.c.
|
||||
Finally, assume that these source files share some common include files.
|
||||
.PP
|
||||
In order to properly convert such a system of programs, you
|
||||
would need to perform the steps shown below.
|
||||
.sp 1
|
||||
.in +0.5i
|
||||
.ft B
|
||||
thisprog s1.c s2.c s3.c
|
||||
.br
|
||||
thisprog s4.c s5.c
|
||||
.sp 1
|
||||
.ft R
|
||||
.in -0.5i
|
||||
.PP
|
||||
In the example above, the first invocation of
|
||||
.I thisprog
|
||||
causes three
|
||||
.B .X
|
||||
files (called
|
||||
.B s1.c.X, s2.c.X,
|
||||
and
|
||||
.B s3.c.X)
|
||||
to be created.
|
||||
These files are generated automatically by
|
||||
.I thisprog
|
||||
(which invokes the GNU C compiler to create them).
|
||||
These files contain information about function definitions and declarations
|
||||
.I both
|
||||
for their corresponding
|
||||
.B .c
|
||||
files and for any files
|
||||
which are included by these
|
||||
.I base
|
||||
.B .c
|
||||
files.
|
||||
.PP
|
||||
After
|
||||
.I thisprog
|
||||
has invoked the compiler for each of the files which make up
|
||||
.I prog1,
|
||||
it performs the actual conversion of these base files (and
|
||||
may perform some conversion of their include files
|
||||
depending upon the information available in the
|
||||
.B .X
|
||||
files).
|
||||
Finally, after performing all necessary conversions,
|
||||
.I thisprog
|
||||
automatically deletes the files
|
||||
.B s1.c.X, s2.c.X,
|
||||
and
|
||||
.B s3.c.X.
|
||||
.PP
|
||||
After performing the conversion for
|
||||
.I prog1,
|
||||
(as illustrated above)
|
||||
you would then
|
||||
request
|
||||
.I thisprog
|
||||
to convert all of the files which make up
|
||||
.I prog2
|
||||
in a similar fashion.
|
||||
This step would create two more
|
||||
.B .X
|
||||
files (called
|
||||
.B s4.c.X
|
||||
and
|
||||
.B s5.c.X).
|
||||
As with the conversion of
|
||||
.I prog1,
|
||||
.I thisprog
|
||||
will automatically generate any needed
|
||||
.B .X
|
||||
files (by invoking the GNU C compiler),
|
||||
will perform the conversion of all of the given
|
||||
.I base
|
||||
source files (and possibly do some conversion on include files),
|
||||
and will finish up by
|
||||
automatically deleting the
|
||||
.B .X
|
||||
files that were generated during this run.
|
||||
.PP
|
||||
You may occasionally find that you need to convert a
|
||||
particular program which
|
||||
consists of several
|
||||
.I base
|
||||
source files, some of which must be compiled
|
||||
with unusual options.
|
||||
In such cases, you can still convert the program via
|
||||
a special mechanism.
|
||||
For each
|
||||
.I base
|
||||
source file which requires special compilation options,
|
||||
you can create a corresponding
|
||||
.B .X
|
||||
file for the
|
||||
.I base
|
||||
file
|
||||
.I (before
|
||||
invoking
|
||||
.I thisprog).
|
||||
You would do this by invoking the GNU C compiler directly
|
||||
with the required special options, and with the
|
||||
.B -fgen-aux-info
|
||||
option.
|
||||
.I Thisprog
|
||||
is smart enough to use existing
|
||||
.B .X
|
||||
files (when they are available and when they are up to date) so creating
|
||||
.B .X
|
||||
files ahead of time with the GNU C compiler
|
||||
is an easy way to accommodate unusual compilation options for individual
|
||||
.I base
|
||||
files.
|
||||
.PP
|
||||
Note that
|
||||
.I thisprog
|
||||
checks each preexisting
|
||||
.B .X
|
||||
file before it tries to use it in order
|
||||
to insure that it is up-to-date
|
||||
with respect to all of the source files
|
||||
that it contains information about.
|
||||
If this check fails,
|
||||
.I thisprog
|
||||
will automatically
|
||||
invoke the GNU C compiler (with default options) to recreate the needed
|
||||
.B .X file.
|
||||
.SH CAVEATS
|
||||
#ifndef UNPRO
|
||||
The
|
||||
.I thisprog
|
||||
program doesn\'t just get information from your own
|
||||
.B .X
|
||||
files. Every time
|
||||
.I thisprog
|
||||
executes, it also reads a file
|
||||
.B SYSCALLS.c.X
|
||||
from some standard installation directory
|
||||
(if it exists) to obtain a pre-written set of function prototypes for
|
||||
various standard system-supplied functions. These prototypes are effectively
|
||||
added to the set of prototypes which
|
||||
.I thisprog
|
||||
can use to perform prototype substitutions on your source files.
|
||||
If the source code for any individual programs that you are converting
|
||||
contains its own definitions
|
||||
for functions with the same names as standard system-supplied functions,
|
||||
.I thisprog
|
||||
is intelligent enough to allow the parameter typing from your own
|
||||
function definitions to take precedence over the information
|
||||
contained in the
|
||||
.B SYSCALLS.c.X
|
||||
file.
|
||||
.PP
|
||||
.I Thisprog
|
||||
changes
|
||||
#ifndef UNPRO
|
||||
(and possibly adds to)
|
||||
#endif
|
||||
your original source code
|
||||
in ways which may require you to rearrange the placement of other
|
||||
items in your code. Specifically, it is often necessary to move
|
||||
around type definitions or declarations for
|
||||
.B "enum, struct,"
|
||||
and
|
||||
.B union
|
||||
types.
|
||||
#ifndef UNPRO
|
||||
.PP
|
||||
Usage of
|
||||
.I thisprog
|
||||
may cause source lines to grow quite long and thereby become difficult
|
||||
to read and to edit. Fortunately,
|
||||
.I thisprog
|
||||
is intelligent enough to automatically break up very long lines containing
|
||||
newly inserted function prototypes whenever the length of
|
||||
any given output line would otherwise exceed 79 columns (including tabs
|
||||
to standard UNIX tab stops).
|
||||
.PP
|
||||
Note that in traditional (K&R) C, it was not possible to declare
|
||||
parameter types for
|
||||
.B "function pointer"
|
||||
parameters and variables.
|
||||
Such function pointer variables could only be
|
||||
declared with empty parameter lists in traditional C. Unfortunately,
|
||||
this means that
|
||||
.I thisprog
|
||||
typically
|
||||
has no adequate source of information from which to manufacture
|
||||
appropriate (prototyped) formal argument lists for such function pointer
|
||||
variables. Thus, declarations of function pointer variables and
|
||||
parameters will not be properly converted by
|
||||
.I thisprog.
|
||||
In the case of function pointer variables,
|
||||
.I thisprog
|
||||
currently performs no conversion whatsoever.
|
||||
In the case of function pointer parameters however,
|
||||
.I thisprog
|
||||
will attempt to do half-hearted conversions by
|
||||
manufacturing formal parameter lists for such parameters.
|
||||
These manufactured formal parameter lists will look
|
||||
like \`\.\.\.\'.
|
||||
#endif
|
||||
.PP
|
||||
#endif
|
||||
It is naive to assume that the conversions performed by
|
||||
.I thisprog
|
||||
are sufficient to make your source code completely compatible with
|
||||
#ifndef UNPRO
|
||||
ANSI C or C++.
|
||||
#else
|
||||
K&R C.
|
||||
#endif
|
||||
The automatic conversion of your source files via
|
||||
.I thisprog
|
||||
is only one step (albeit a big one) towards
|
||||
full conversion. A full conversion may also require
|
||||
lots of editing "by hand".
|
||||
.PP
|
||||
.I Thisprog
|
||||
only converts function declarations and definitions. No conversion of
|
||||
.I types
|
||||
(such as function types and pointer-to-function types)
|
||||
contained in
|
||||
.B typedef
|
||||
statements is attempted. These must be converted manually.
|
||||
#ifdef UNPRO
|
||||
.PP
|
||||
Naive conversion of source code via
|
||||
.I thisprog
|
||||
may introduce bugs into the resulting (converted) code unless you are very
|
||||
careful. The reason for this is rather subtle.
|
||||
Basically, when a call is made to a prototyped function, the types of
|
||||
some of the parameter values in the call may be implicitly converted
|
||||
to the types of the corresponding formal parameters (as declared in the
|
||||
function prototype). These implicit conversions can (occasionally) involve
|
||||
changes of representation for the passed values (for instance from int
|
||||
to float). Unfortunately, once your code has been converted via
|
||||
.I thisprog,
|
||||
these implicit conversions will no longer take place within the function
|
||||
calls which require them.
|
||||
.PP
|
||||
The only remedy for this problem (currently) is for users of
|
||||
.I thisprog
|
||||
to make sure that explicit casts are inserted into calls which will force
|
||||
these type conversions to occur even in the absence of function
|
||||
prototypes. Users can determine the exact set of places where such explicit
|
||||
casts may be required by compiling all code to be converted using the
|
||||
.B -Wconversion
|
||||
option to GCC prior to conversion. The warnings produced by
|
||||
.B -Wconversion
|
||||
will indicate those places in the original source code where explicit
|
||||
casts must be inserted. Once these explicit casts have been manually
|
||||
inserted (and the warnings from
|
||||
.B -Wconversion
|
||||
eliminated), conversion may be performed without any possibility of
|
||||
generating code which is incorrect due to missed type conversions.
|
||||
#else
|
||||
.PP
|
||||
When converting to full prototype format, it may often be the case that
|
||||
complete information regarding the types of function parameters is not
|
||||
actually available in the original (K&R) code.
|
||||
This will almost always be the case for parameters whose types are
|
||||
pointer-to-function types.
|
||||
For pointer-to-function parameters, it it customary (in K&R C) to
|
||||
omit the types of the arguments which the pointed-to function expects
|
||||
to receive.
|
||||
In cases where the argument types for function pointer parameters are
|
||||
not present in the original source code,
|
||||
.I thisprog
|
||||
notes this lack of complete information in a useful (but harmless)
|
||||
way. After conversion, the (prototyped) parameter lists for
|
||||
pointer-to-function parameters are represented in the converted
|
||||
files as comments which contain the string "???". You can easily
|
||||
locate all such strings after conversion (using your favorite editor)
|
||||
and replace them with more complete information regarding the
|
||||
true parameter profile of the pointed-to functions.
|
||||
#endif
|
||||
.SH WARNINGS
|
||||
There are numerous possible warning and error messages which
|
||||
.I thisprog
|
||||
may issue for strange circumstances (e.g.\ missing input
|
||||
files, etc.) or for noteworthy conditions in the source code being converted.
|
||||
These should all be self-explanatory.
|
||||
If any message is not self-explanatory, it\'s a bug. Please report it.
|
||||
.SH FILES
|
||||
.ta 3.0i
|
||||
/usr/local/bin/gcc GNU C compiler
|
||||
.br
|
||||
/usr/local/bin/thisprog the thisprog program
|
||||
#ifndef UNPRO
|
||||
.br
|
||||
/usr/local/lib/SYSCALLS.c.X aux info file for system functions
|
||||
#endif
|
||||
.SH "SEE ALSO"
|
||||
gcc(1), g++(1), otherprog(1)
|
||||
.SH BUGS
|
||||
.I Thisprog
|
||||
can easily be confused by
|
||||
source code which has
|
||||
macro calls in the
|
||||
vicinity of something which it has to convert.
|
||||
Fortunately, such cases seem to be rare in practice.
|
||||
This is an inherent problem with the compiler
|
||||
based approach to information gathering and will likely never be fixed.
|
||||
When it does become confused,
|
||||
.I thisprog
|
||||
will still proceed to convert the file it is working on as much as
|
||||
possible. Only the particularly confusing function definitions and
|
||||
declarations will fail to be converted. These can subsequently be converted
|
||||
manually.
|
||||
.PP
|
||||
Due to the method currently used to gather information,
|
||||
.I thisprog
|
||||
will fail to convert function declarations and definitions which
|
||||
are located in conditional compilation sections which were
|
||||
.I "preprocessed out"
|
||||
during the creation of the
|
||||
.B .X
|
||||
files used for conversion.
|
||||
You can generally work around this problem by doing
|
||||
repeated conversion steps using
|
||||
.I thisprog,
|
||||
each with a different set of compilation options (i.e.\ preprocessor
|
||||
symbol definitions) but assuring complete conversion can
|
||||
currently only be done by visual inspection.
|
||||
Currently,
|
||||
.I thisprog
|
||||
attempts to find function definitions which were
|
||||
.I "preprocessed out"
|
||||
and to issues warnings for such cases.
|
||||
A later revision of
|
||||
.I thisprog
|
||||
#ifndef UNPRO
|
||||
may also be able to detect cases where function declarations
|
||||
have been
|
||||
.I "preprocessed out"
|
||||
and to issue appropriate warnings for those cases also.
|
||||
#else
|
||||
may be able to convert both function declarations and function
|
||||
definitions which have been
|
||||
.I "preprocessed out."
|
||||
#endif
|
||||
.PP
|
||||
Currently,
|
||||
.I thisprog
|
||||
makes no attempt to convert declarations of
|
||||
.I "pointer to function"
|
||||
types, variables, or fields.
|
||||
#ifdef UNPRO
|
||||
A later version of
|
||||
.I thisprog
|
||||
may attempt to perform conversions of these
|
||||
declarative items also.
|
||||
#endif
|
||||
.PP
|
||||
Currently,
|
||||
.I from_convention
|
||||
functions definitions
|
||||
#ifndef UNPRO
|
||||
and declarations
|
||||
#endif
|
||||
must be converted by hand to use the
|
||||
.I to_convention
|
||||
convention.
|
||||
It is possible that a subsequent version of
|
||||
.I thisprog
|
||||
will make some attempt to do these conversions automatically.
|
||||
.PP
|
||||
.I Thisprog
|
||||
may get confused if it finds that it has to convert a function
|
||||
declaration or definition in a region of source code where
|
||||
there is more than one formal parameter list present.
|
||||
Thus, attempts to convert code containing
|
||||
multiple (conditionally compiled) versions of a single
|
||||
function header (in the same vicinity) may not produce
|
||||
the desired (or expected) results.
|
||||
If you plan on converting source files which contain
|
||||
such code, it is recommended that you first make sure
|
||||
that each conditionally compiled region of source
|
||||
code which contains an alternative function header
|
||||
also contains at least one additional follower token
|
||||
(past the final right parenthesis of the function header).
|
||||
This should circumvent the problem.
|
||||
#ifdef UNPRO
|
||||
.PP
|
||||
.I Thisprog
|
||||
can become confused when trying to convert a function
|
||||
definition or declaration
|
||||
which contains a declaration for a
|
||||
.I pointer-to-function
|
||||
formal argument
|
||||
which has the same name as the function being defined or
|
||||
declared.
|
||||
Such unfortunate choices of formal parameter names are discouraged.
|
||||
#endif
|
||||
.PP
|
||||
Bugs (and requests for reasonable enhancements) should be reported to
|
||||
bug-gcc@prep.ai.mit.edu. Bugs may actually be fixed if they can be easily
|
||||
reproduced, so it is in your interest to report them
|
||||
in such a way that reproduction is easy.
|
||||
.SH COPYING
|
||||
Copyright (c) 1989, 1990 Free Software Foundation, Inc.
|
||||
.sp 1
|
||||
Permission is granted to make and distribute verbatim copies of
|
||||
this manual provided the copyright notice and this permission notice
|
||||
are preserved on all copies.
|
||||
.sp 1
|
||||
Permission is granted to copy and distribute modified versions of this
|
||||
manual under the conditions for verbatim copying, provided that the
|
||||
entire resulting derived work is distributed under the terms of a
|
||||
permission notice identical to this one.
|
||||
.sp 1
|
||||
Permission is granted to copy and distribute translations of this
|
||||
manual into another language, under the above conditions for modified
|
||||
versions, except that this permission notice may be included in
|
||||
translations approved by the Free Software Foundation instead of in
|
||||
the original English.
|
||||
.SH AUTHORS
|
||||
Written by Ronald F.\ Guilmette at the Microelectronics and Computer Technology
|
||||
Corporation (MCC). Generously donated by MCC to the Free Software
|
||||
Foundation.
|
||||
.sp 1
|
||||
See the GNU C Compiler Manual for a list of contributors to GNU C.
|
||||
4673
gcc/protoize.c
4673
gcc/protoize.c
File diff suppressed because it is too large
Load Diff
253
gcc/scan-decls.c
253
gcc/scan-decls.c
|
|
@ -1,253 +0,0 @@
|
|||
/* scan-decls.c - Extracts declarations from cpp output.
|
||||
Copyright (C) 1993, 1995, 1997, 1998 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Written by Per Bothner <bothner@cygnus.com>, July 1993. */
|
||||
|
||||
#include "hconfig.h"
|
||||
#include "system.h"
|
||||
#include "cpplib.h"
|
||||
#include "scan.h"
|
||||
|
||||
int brace_nesting = 0;
|
||||
|
||||
/* The first extern_C_braces_length elements of extern_C_braces
|
||||
indicate the (brace nesting levels of) left braces that were
|
||||
prefixed by extern "C". */
|
||||
int extern_C_braces_length = 0;
|
||||
char extern_C_braces[20];
|
||||
#define in_extern_C_brace (extern_C_braces_length>0)
|
||||
|
||||
/* True if the function declaration currently being scanned is
|
||||
prefixed by extern "C". */
|
||||
int current_extern_C = 0;
|
||||
|
||||
static void
|
||||
skip_to_closing_brace (pfile)
|
||||
cpp_reader *pfile;
|
||||
{
|
||||
int nesting = 1;
|
||||
for (;;)
|
||||
{
|
||||
enum cpp_token token = cpp_get_token (pfile);
|
||||
if (token == CPP_EOF)
|
||||
break;
|
||||
if (token == CPP_LBRACE)
|
||||
nesting++;
|
||||
if (token == CPP_RBRACE && --nesting == 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* This function scans a C source file (actually, the output of cpp),
|
||||
reading from FP. It looks for function declarations, and
|
||||
external variable declarations.
|
||||
|
||||
The following grammar (as well as some extra stuff) is recognized:
|
||||
|
||||
declaration:
|
||||
(decl-specifier)* declarator ("," declarator)* ";"
|
||||
decl-specifier:
|
||||
identifier
|
||||
keyword
|
||||
extern "C"
|
||||
declarator:
|
||||
(ptr-operator)* dname [ "(" argument-declaration-list ")" ]
|
||||
ptr-operator:
|
||||
("*" | "&") ("const" | "volatile")*
|
||||
dname:
|
||||
identifier
|
||||
|
||||
Here dname is the actual name being declared.
|
||||
*/
|
||||
|
||||
int
|
||||
scan_decls (pfile, argc, argv)
|
||||
cpp_reader *pfile;
|
||||
int argc ATTRIBUTE_UNUSED;
|
||||
char **argv ATTRIBUTE_UNUSED;
|
||||
{
|
||||
int saw_extern, saw_inline;
|
||||
int start_written;
|
||||
/* If declarator_start is non-zero, it marks the start of the current
|
||||
declarator. If it is zero, we are either still parsing the
|
||||
decl-specs, or prev_id_start marks the start of the declarator. */
|
||||
int declarator_start;
|
||||
int prev_id_start, prev_id_end;
|
||||
enum cpp_token token;
|
||||
|
||||
new_statement:
|
||||
CPP_SET_WRITTEN (pfile, 0);
|
||||
start_written = 0;
|
||||
token = cpp_get_token (pfile);
|
||||
|
||||
handle_statement:
|
||||
current_extern_C = 0;
|
||||
saw_extern = 0;
|
||||
saw_inline = 0;
|
||||
if (token == CPP_RBRACE)
|
||||
{
|
||||
/* Pop an 'extern "C"' nesting level, if appropriate. */
|
||||
if (extern_C_braces_length
|
||||
&& extern_C_braces[extern_C_braces_length - 1] == brace_nesting)
|
||||
extern_C_braces_length--;
|
||||
brace_nesting--;
|
||||
goto new_statement;
|
||||
}
|
||||
if (token == CPP_LBRACE)
|
||||
{
|
||||
brace_nesting++;
|
||||
goto new_statement;
|
||||
}
|
||||
if (token == CPP_EOF)
|
||||
return 0;
|
||||
if (token == CPP_SEMICOLON)
|
||||
goto new_statement;
|
||||
if (token != CPP_NAME)
|
||||
goto new_statement;
|
||||
|
||||
prev_id_start = 0;
|
||||
declarator_start = 0;
|
||||
for (;;)
|
||||
{
|
||||
switch (token)
|
||||
{
|
||||
case CPP_LPAREN:
|
||||
/* Looks like this is the start of a formal parameter list. */
|
||||
if (prev_id_start)
|
||||
{
|
||||
int nesting = 1;
|
||||
int have_arg_list = 0;
|
||||
cpp_buffer *fbuf = cpp_file_buffer (pfile);
|
||||
long func_lineno;
|
||||
cpp_buf_line_and_col (fbuf, &func_lineno, NULL);
|
||||
for (;;)
|
||||
{
|
||||
token = cpp_get_token (pfile);
|
||||
if (token == CPP_LPAREN)
|
||||
nesting++;
|
||||
else if (token == CPP_RPAREN)
|
||||
{
|
||||
nesting--;
|
||||
if (nesting == 0)
|
||||
break;
|
||||
}
|
||||
else if (token == CPP_EOF)
|
||||
break;
|
||||
else if (token == CPP_NAME || token == CPP_3DOTS)
|
||||
have_arg_list = 1;
|
||||
}
|
||||
recognized_function (pfile->token_buffer + prev_id_start,
|
||||
prev_id_end - prev_id_start,
|
||||
(saw_inline ? 'I'
|
||||
: in_extern_C_brace || current_extern_C
|
||||
? 'F' : 'f'),
|
||||
pfile->token_buffer, prev_id_start,
|
||||
have_arg_list,
|
||||
fbuf->nominal_fname, func_lineno);
|
||||
token = cpp_get_non_space_token (pfile);
|
||||
if (token == CPP_LBRACE)
|
||||
{
|
||||
/* skip body of (normally) inline function */
|
||||
skip_to_closing_brace (pfile);
|
||||
goto new_statement;
|
||||
}
|
||||
goto maybe_handle_comma;
|
||||
}
|
||||
break;
|
||||
case CPP_OTHER:
|
||||
if (CPP_WRITTEN (pfile) == (size_t) start_written + 1
|
||||
&& (CPP_PWRITTEN (pfile)[-1] == '*'
|
||||
|| CPP_PWRITTEN (pfile)[-1] == '&'))
|
||||
declarator_start = start_written;
|
||||
else
|
||||
goto handle_statement;
|
||||
break;
|
||||
case CPP_COMMA:
|
||||
case CPP_SEMICOLON:
|
||||
if (prev_id_start && saw_extern)
|
||||
{
|
||||
recognized_extern (pfile->token_buffer + prev_id_start,
|
||||
prev_id_end - prev_id_start,
|
||||
pfile->token_buffer,
|
||||
prev_id_start);
|
||||
}
|
||||
/* ... fall through ... */
|
||||
maybe_handle_comma:
|
||||
if (token != CPP_COMMA)
|
||||
goto new_statement;
|
||||
handle_comma:
|
||||
/* Handle multiple declarators in a single declaration,
|
||||
as in: extern char *strcpy (), *strcat (), ... ; */
|
||||
if (declarator_start == 0)
|
||||
declarator_start = prev_id_start;
|
||||
CPP_SET_WRITTEN (pfile, declarator_start);
|
||||
break;
|
||||
case CPP_NAME:
|
||||
/* "inline" and "extern" are recognized but skipped */
|
||||
if (strcmp (pfile->token_buffer, "inline") == 0)
|
||||
{
|
||||
saw_inline = 1;
|
||||
CPP_SET_WRITTEN (pfile, start_written);
|
||||
}
|
||||
if (strcmp (pfile->token_buffer, "extern") == 0)
|
||||
{
|
||||
saw_extern = 1;
|
||||
CPP_SET_WRITTEN (pfile, start_written);
|
||||
token = cpp_get_non_space_token (pfile);
|
||||
if (token == CPP_STRING
|
||||
&& strcmp (pfile->token_buffer, "\"C\"") == 0)
|
||||
{
|
||||
CPP_SET_WRITTEN (pfile, start_written);
|
||||
current_extern_C = 1;
|
||||
token = cpp_get_non_space_token (pfile);
|
||||
if (token == CPP_LBRACE)
|
||||
{
|
||||
brace_nesting++;
|
||||
extern_C_braces[extern_C_braces_length++]
|
||||
= brace_nesting;
|
||||
goto new_statement;
|
||||
}
|
||||
}
|
||||
else
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
/* This may be the name of a variable or function. */
|
||||
prev_id_start = start_written;
|
||||
prev_id_end = CPP_WRITTEN (pfile);
|
||||
break;
|
||||
|
||||
case CPP_EOF:
|
||||
return 0;
|
||||
|
||||
case CPP_LBRACE: case CPP_RBRACE: case CPP_DIRECTIVE:
|
||||
goto new_statement; /* handle_statement? */
|
||||
|
||||
case CPP_HSPACE: case CPP_VSPACE: case CPP_COMMENT: case CPP_POP:
|
||||
/* Skip initial white space. */
|
||||
if (start_written == 0)
|
||||
CPP_SET_WRITTEN (pfile, 0);
|
||||
break;
|
||||
|
||||
default:
|
||||
prev_id_start = 0;
|
||||
}
|
||||
|
||||
start_written = CPP_WRITTEN (pfile);
|
||||
token = cpp_get_token (pfile);
|
||||
}
|
||||
}
|
||||
241
gcc/scan.c
241
gcc/scan.c
|
|
@ -1,241 +0,0 @@
|
|||
/* Utility functions for scan-decls and fix-header programs.
|
||||
Copyright (C) 1993, 1994, 1998 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include "hconfig.h"
|
||||
#include "system.h"
|
||||
#include "scan.h"
|
||||
|
||||
int lineno = 1;
|
||||
int source_lineno = 1;
|
||||
sstring source_filename;
|
||||
|
||||
void
|
||||
make_sstring_space (str, count)
|
||||
sstring *str;
|
||||
int count;
|
||||
{
|
||||
int cur_pos = str->ptr - str->base;
|
||||
int cur_size = str->limit - str->base;
|
||||
int new_size = cur_pos + count + 100;
|
||||
|
||||
if (new_size <= cur_size)
|
||||
return;
|
||||
|
||||
if (str->base == NULL)
|
||||
str->base = xmalloc (new_size);
|
||||
else
|
||||
str->base = xrealloc (str->base, new_size);
|
||||
str->ptr = str->base + cur_size;
|
||||
str->limit = str->base + new_size;
|
||||
}
|
||||
|
||||
void
|
||||
sstring_append (dst, src)
|
||||
sstring *dst;
|
||||
sstring *src;
|
||||
{
|
||||
register char *d, *s;
|
||||
register int count = SSTRING_LENGTH(src);
|
||||
MAKE_SSTRING_SPACE(dst, count + 1);
|
||||
d = dst->ptr;
|
||||
s = src->base;
|
||||
while (--count >= 0) *d++ = *s++;
|
||||
dst->ptr = d;
|
||||
*d = 0;
|
||||
}
|
||||
|
||||
int
|
||||
scan_ident (fp, s, c)
|
||||
register FILE *fp;
|
||||
register sstring *s;
|
||||
int c;
|
||||
{
|
||||
s->ptr = s->base;
|
||||
if (ISALPHA(c) || c == '_')
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
SSTRING_PUT(s, c);
|
||||
c = getc (fp);
|
||||
if (c == EOF || !(ISALNUM(c) || c == '_'))
|
||||
break;
|
||||
}
|
||||
}
|
||||
MAKE_SSTRING_SPACE(s, 1);
|
||||
*s->ptr = 0;
|
||||
return c;
|
||||
}
|
||||
|
||||
int
|
||||
scan_string (fp, s, init)
|
||||
register FILE *fp;
|
||||
register sstring *s;
|
||||
int init;
|
||||
{
|
||||
int c;
|
||||
for (;;)
|
||||
{
|
||||
c = getc (fp);
|
||||
if (c == EOF || c == '\n')
|
||||
break;
|
||||
if (c == init)
|
||||
{
|
||||
c = getc (fp);
|
||||
break;
|
||||
}
|
||||
if (c == '\\')
|
||||
{
|
||||
c = getc (fp);
|
||||
if (c == EOF)
|
||||
break;
|
||||
if (c == '\n')
|
||||
continue;
|
||||
}
|
||||
SSTRING_PUT(s, c);
|
||||
}
|
||||
MAKE_SSTRING_SPACE(s, 1);
|
||||
*s->ptr = 0;
|
||||
return c;
|
||||
}
|
||||
|
||||
/* Skip horizontal white spaces (spaces, tabs, and C-style comments). */
|
||||
|
||||
int
|
||||
skip_spaces (fp, c)
|
||||
register FILE *fp;
|
||||
int c;
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
if (c == ' ' || c == '\t')
|
||||
c = getc (fp);
|
||||
else if (c == '/')
|
||||
{
|
||||
c = getc (fp);
|
||||
if (c != '*')
|
||||
{
|
||||
ungetc (c, fp);
|
||||
return '/';
|
||||
}
|
||||
c = getc (fp);
|
||||
for (;;)
|
||||
{
|
||||
if (c == EOF)
|
||||
return EOF;
|
||||
else if (c != '*')
|
||||
{
|
||||
if (c == '\n')
|
||||
source_lineno++, lineno++;
|
||||
c = getc (fp);
|
||||
}
|
||||
else if ((c = getc (fp)) == '/')
|
||||
return getc (fp);
|
||||
}
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
int
|
||||
read_upto (fp, str, delim)
|
||||
FILE *fp;
|
||||
sstring *str;
|
||||
int delim;
|
||||
{
|
||||
int ch;
|
||||
for (;;)
|
||||
{
|
||||
ch = getc (fp);
|
||||
if (ch == EOF || ch == delim)
|
||||
break;
|
||||
SSTRING_PUT(str, ch);
|
||||
}
|
||||
MAKE_SSTRING_SPACE(str, 1);
|
||||
*str->ptr = 0;
|
||||
return ch;
|
||||
}
|
||||
|
||||
int
|
||||
get_token (fp, s)
|
||||
register FILE *fp;
|
||||
register sstring *s;
|
||||
{
|
||||
int c;
|
||||
s->ptr = s->base;
|
||||
retry:
|
||||
c = ' ';
|
||||
c = skip_spaces (fp, c);
|
||||
if (c == '\n')
|
||||
{
|
||||
source_lineno++;
|
||||
lineno++;
|
||||
goto retry;
|
||||
}
|
||||
if (c == '#')
|
||||
{
|
||||
c = get_token (fp, s);
|
||||
if (c == INT_TOKEN)
|
||||
{
|
||||
source_lineno = atoi (s->base) - 1; /* '\n' will add 1 */
|
||||
get_token (fp, &source_filename);
|
||||
}
|
||||
for (;;)
|
||||
{
|
||||
c = getc (fp);
|
||||
if (c == EOF)
|
||||
return EOF;
|
||||
if (c == '\n')
|
||||
{
|
||||
source_lineno++;
|
||||
lineno++;
|
||||
goto retry;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (c == EOF)
|
||||
return EOF;
|
||||
if (ISDIGIT (c))
|
||||
{
|
||||
do
|
||||
{
|
||||
SSTRING_PUT(s, c);
|
||||
c = getc (fp);
|
||||
} while (c != EOF && ISDIGIT(c));
|
||||
ungetc (c, fp);
|
||||
c = INT_TOKEN;
|
||||
goto done;
|
||||
}
|
||||
if (ISALPHA (c) || c == '_')
|
||||
{
|
||||
c = scan_ident (fp, s, c);
|
||||
ungetc (c, fp);
|
||||
return IDENTIFIER_TOKEN;
|
||||
}
|
||||
if (c == '\'' || c == '"')
|
||||
{
|
||||
c = scan_string (fp, s, c);
|
||||
ungetc (c, fp);
|
||||
return c == '\'' ? CHAR_TOKEN : STRING_TOKEN;
|
||||
}
|
||||
SSTRING_PUT(s, c);
|
||||
done:
|
||||
MAKE_SSTRING_SPACE(s, 1);
|
||||
*s->ptr = 0;
|
||||
return c;
|
||||
}
|
||||
75
gcc/scan.h
75
gcc/scan.h
|
|
@ -1,75 +0,0 @@
|
|||
/* scan.h - Utility declarations for scan-decls and fix-header programs.
|
||||
Copyright (C) 1993, 1998 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
typedef struct sstring
|
||||
{
|
||||
char *base;
|
||||
char *ptr;
|
||||
char *limit;
|
||||
} sstring;
|
||||
|
||||
#define INIT_SSTRING(STR) ((STR)->base = 0, (STR)->ptr = 0, (STR)->limit = 0)
|
||||
#define FREE_SSTRING(STR) do { if ((STR)->base) free (STR)->base; } while(0)
|
||||
#define SSTRING_PUT(STR, C) do {\
|
||||
if ((STR)->limit <= (STR)->ptr) make_sstring_space (STR, 1); \
|
||||
*(STR)->ptr++ = (C); } while (0)
|
||||
#define SSTRING_LENGTH(STR) ((STR)->ptr - (STR)->base)
|
||||
#define MAKE_SSTRING_SPACE(STR, COUNT) \
|
||||
if ((STR)->limit - (STR)->ptr < (COUNT)) make_sstring_space (STR, COUNT);
|
||||
|
||||
#ifndef _PARAMS
|
||||
#if defined(ANSI_PROTOTYPES) || defined(__cplusplus)
|
||||
#define _PARAMS(args) args
|
||||
#else
|
||||
#define _PARAMS(args) ()
|
||||
#endif
|
||||
#endif
|
||||
|
||||
struct partial_proto;
|
||||
struct fn_decl
|
||||
{
|
||||
char *fname;
|
||||
char *rtype;
|
||||
char *params;
|
||||
struct partial_proto *partial;
|
||||
};
|
||||
|
||||
extern int lineno;
|
||||
extern void sstring_append _PARAMS((sstring *, sstring *));
|
||||
extern void make_sstring_space _PARAMS((sstring *, int));
|
||||
extern int skip_spaces _PARAMS((FILE *, int));
|
||||
extern int scan_ident _PARAMS((FILE *, sstring *, int));
|
||||
extern int scan_string _PARAMS((FILE *, sstring *, int));
|
||||
extern int read_upto _PARAMS((FILE *, sstring *, int));
|
||||
extern unsigned long hash _PARAMS((const char *));
|
||||
extern void recognized_function _PARAMS((char *, int, int, char *, int, int, char *, int));
|
||||
extern void recognized_extern _PARAMS((char *, int, char *, int));
|
||||
|
||||
/* get_token is a simple C lexer. */
|
||||
#define IDENTIFIER_TOKEN 300
|
||||
#define CHAR_TOKEN 301
|
||||
#define STRING_TOKEN 302
|
||||
#define INT_TOKEN 303
|
||||
extern int get_token _PARAMS ((FILE *, sstring *));
|
||||
|
||||
/* Current file and line numer, taking #-directives into account */
|
||||
extern int source_lineno;
|
||||
extern sstring source_filename;
|
||||
/* Current physical line number */
|
||||
extern int lineno;
|
||||
1354
gcc/sys-protos.h
1354
gcc/sys-protos.h
File diff suppressed because it is too large
Load Diff
|
|
@ -1,2 +0,0 @@
|
|||
#define UNPROTOIZE
|
||||
#include "protoize.c"
|
||||
Loading…
Reference in New Issue
Block a user